{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这一章是讲学习理论的，涉及了VC dimension以及bias,var的知识，比较难，数学推导很多，我做这些习题估计前前后后有三四十个小时，感觉还需要多体会几遍。\n",
    "\n",
    "我的github地址：  \n",
    "https://github.com/Doraemonzzz\n",
    "\n",
    "个人主页：  \n",
    "http://doraemonzzz.com/\n",
    "\n",
    "\n",
    "参考资料:  \n",
    "https://blog.csdn.net/a1015553840/article/details/51085129  \n",
    "http://www.vynguyen.net/category/study/machine-learning/page/6/  \n",
    "http://book.caltech.edu/bookforum/index.php  \n",
    "http://beader.me/mlnotebook/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Chapter2 Taining versus Testing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Part 1:Exercise"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Exercise 2.1 (Page 45)\n",
    "\n",
    "By inspection , find a break point $k$ for each hypothesis set in Example 2.2(if there is one). Verify that $m_H (k) < 2^k$ using the formulas derived in that Example.\n",
    "\n",
    " Example 2.2可以参考课本43页，这里直接给出结果\n",
    " 对例(1)来说，$m_H (N)=N+1$\n",
    "\n",
    "| $N$  | m_H(N) | $2^N$ |\n",
    "| ---- | ------ | ----- |\n",
    "| 1    | 2      | 2     |\n",
    "| 2    | 3      | 4     |\n",
    "\n",
    "所以break point k可以取2\n",
    "\n",
    " 对例(2)来说，$m_H (N)=\\frac 1 2N^2+\\frac 1 2N+1$\n",
    "\n",
    "| $N$  | m_H(N) | $2^N$ |\n",
    "| ---- | ------ | ----- |\n",
    "| 1    | 2      | 2     |\n",
    "| 2    | 4      | 4     |\n",
    "| 3    | 7      | 8     |\n",
    "\n",
    "所以break point k可以取3\n",
    "\n",
    "对例(3)来说，$m_H (N)=2^N$，所以没有break point"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Exercise 2.2 (Page 50)\n",
    "(a) Verify the bound of Theorem 2.4 in the three cases of Example 2.2:  \n",
    "  (i) Positive rays: $H$ consists of all hypotheses in one dimension of the form $h(x) = sign(x - a)$.  \n",
    "  (ii) Positive intervals: $H$ consists of all hypotheses in one dimension that are positive within some interval and negative elsewhere.  \n",
    "  (iii) Convex sets: $H$ consists of all hypotheses in two dimensions that are positive inside some convex set and negative elsewhere.  \n",
    "  (Note: you can use the break points you found in Exercise 2.1)  \n",
    "(b) Does there exist a hypothesis set for which $m_N(N) = N+ 2^{\\lfloor \\frac N 2 \\rfloor}$  \n",
    "(where $\\lfloor \\frac N 2 \\rfloor$ is the largest integer $\\le \\frac N 2$)?\n",
    "\n",
    "这题是我让我们在具体例子下验证下之前的理论。\n",
    "先回顾下之前的理论：\n",
    "$$\n",
    "如果对于某个k, m_H (k) < 2^k,那么对于所有N\n",
    "\\\\m_H(N)\\le \\sum_{i=0}^{k-1}\\binom{N}{i}\n",
    "$$\n",
    "所以对于(i)来说，之前求得$k=2$，因此\n",
    "$$\n",
    "m_H(N)=N+1\\le \\sum_{i=0}^{k-1}\\binom{N}{i}=\\sum_{i=0}^{1}\\binom{N}{i}=1+N\n",
    "$$\n",
    "对于(ii)来说，之前求得$k=3$，因此\n",
    "$$\n",
    "\\begin{aligned}\n",
    "m_H (N)&=\\frac 1 2N^2+\\frac 1 2N+1\\le \\sum_{i=0}^{k-1}\\binom{N}{i}\n",
    "\\\\&=\\sum_{i=0}^{2}\\binom{N}{i}=1+N+\\frac 1 2N(N-1)\n",
    "\\\\&=\\frac 1 2N^2+\\frac 1 2N+1\n",
    "\\end{aligned}\n",
    "$$\n",
    "对于(iii)来说，之前没有break point，但是$m_H (N)=2^N$，所以我们可以在定理中取$k=N+1$\n",
    "$$\n",
    "\\begin{aligned}\n",
    "m_H (N)&=2^N\\le \\sum_{i=0}^{k-1}\\binom{N}{i}\n",
    "\\\\&=\\sum_{i=0}^{N}\\binom{N}{i}=2^N\n",
    "\\end{aligned}\n",
    "$$\n",
    "\n",
    "(b)这题我的理解是否，因为如果成立，那么\n",
    "$$\n",
    "m_N(N) = N+ 2^{\\lfloor \\frac N 2 \\rfloor}\\le\\sum_{i=0}^{k-1}\\binom{N}{i}\n",
    "$$\n",
    "不等式左边是$N$的指数函数,右边是$N$的多项式，所以当$N$充分大时不可能成立。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Exercise 2.3 (Page 50)\n",
    "Compute the VC dimension of $H$ for the hypothesis sets in parts (i), (ii),(iii) of Exercise 2.2(a).\n",
    "\n",
    "这题需要计算VC维，由公式$k = d_{vc} + 1$，$k$为最小的break point，可以轻松得到。\n",
    "\n",
    "(i)$k=2,d_{vc}=1$  \n",
    "(ii)$k=3,d_{vc}=2$  \n",
    "(iii)$k=+ \\infty,d_{vc}=+ \\infty$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "#### Exercise 2.4 (Page 52)\n",
    "Consider the input space $X=\\{1\\}\\times R^d $(including the constant coordinate $x_0 = 1$). Show that the VC dimension of the perceptron (with $d+1$ parameters, counting $w_0$) is exactly $d+1$ by showing that it is at least $d+1$ and at most $d+1$, as follows.\n",
    "\n",
    "(a) To show that $d_{vc}\\ge d+1$, find $d+1$ points in $X$ that the perceptron can shatter. [Hint: Construct a nonsingular $(d+1) \\times (d+1)$ matrix whose rows represent the $d+1$ points, then use the nonsingularity to argue that the perceptron can shatter these points.]\n",
    "\n",
    "(b) To show that $d_{vc}\\le d+1$, show that no set of $d+2$ points in $X$ can be shattered by the perceptron. [Hint: Represent each point in as a vector of length $d+1$, then use the fact that any $d+2$ vectors of length $d+1$ have to be linearl dependent. This means that some vector is a linear combination of all the other vectors.\n",
    "Now, if you choose the cass of these other vectors carefully then the classification of the dependent vector will be dictated. Conclude that there is some dichotomy that cannot be implemented, and therefre that for $N\\ge d+ 2, m_H (N) < 2^N$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这题实际上给出了证明$d_{vc}=d$的一般思路：证明$d_{vc}\\le d$以及\n",
    "$d_{vc}\\ge d$。证明$d_{vc}\\le d$只要找出$d$个点可以被shattered既可以，证明$d_{vc}\\ge d$则需要说明任何$d+1$个点都不能被shattered\n",
    "\n",
    "回到原题，先看(a)，构造一个$(d+1)\\times(d+1)$矩阵\n",
    "$$\n",
    "\\left(\n",
    "\\begin{matrix}\n",
    "1&1&1&...&1\\\\\n",
    "1&2&2^2&...&2^{d}\\\\\n",
    "1&3&3^2&...&3^{d}\\\\\n",
    "...&...&...&...&...\\\\\n",
    "1&(d+1)&(d+1)^2&...&(d+1)^{d}\n",
    "\\end{matrix}\n",
    "\\right)\n",
    "$$\n",
    "它对应的行列式为范德蒙行列式，行列式的值不为$0$，因此对于任意的$y=(y_1,y_2,...y_{d+1})^T$，以下方程组恒有解。\n",
    "$$\n",
    "\\left(\n",
    "\\begin{matrix}\n",
    "1&1&1&...&1\\\\\n",
    "1&2&2^2&...&2^{d}\\\\\n",
    "1&3&3^2&...&3^{d}\\\\\n",
    "...&...&...&...&...\\\\\n",
    "1&(d+1)&(d+1)^2&...&(d+1)^{d}\n",
    "\\end{matrix}\n",
    "\\right)\n",
    "\\times\n",
    "\\left(\n",
    "\\begin{matrix}\n",
    "x_1\\\\\n",
    "x_2\\\\\n",
    "x_3\\\\\n",
    "...\\\\\n",
    "x_{d+1}\n",
    "\\end{matrix}\n",
    "\\right)\n",
    "=\n",
    "\\left(\n",
    "\\begin{matrix}\n",
    "y_1\\\\\n",
    "y_2\\\\\n",
    "y_3\\\\\n",
    "...\\\\\n",
    "y_{d+1}\n",
    "\\end{matrix}\n",
    "\\right)\n",
    "$$\n",
    "换句话说，这$d+1$个特殊的点可以被shattered，因此$d_{vc}\\ge d+1$\n",
    "\n",
    "(b)不妨设感知机的模型为$f(x)=sign(w^Tx)$\n",
    "我们知道在$d+1$维空间中的任何$d+2$个向量均线性相关,因此不妨设$z_{d+2}$可以被线性表出\n",
    "$$\n",
    "z_{d+2}=\\sum_{i=1}^{d+1}k_iz_i\\\\\n",
    "w^Tz_{d+2}=\\sum_{i=1}^{d+1}w^Tk_iz_i\\\\\n",
    "sign(w^Tz_{d+2})=sign(\\sum_{i=1}^{d+1}k_iw^Tz_i)\n",
    "$$\n",
    "也就是说$z_{d+2}$的分类被$z_1,z_2...z_{d+1}$确定，那么\n",
    "$(sign(z_1),sign(z_2)...sign(z_{d+1}),-sign(z_{d+2}))$这种情形必然无法被划分出来，因此$d_{vc}\\le d+1$\n",
    "\n",
    "综上所述$d_{vc}=d+1$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Exercise 2.5 (Page 56)\n",
    "Suppose we have a simple learning model whose growth function is $m_H(N) = N+1$ , hence $d_{vc} =1$. Use the VC bound (2.12) to estimate the probability that $E_{out}$ will be within 0.1 of $E_{in}$ given 100 training examples. [Hint: The estimate wil be ridiculous.}\n",
    "\n",
    "这里回顾下(2.12) (Page 53)  \n",
    "Theorem 2.5 (VC generalization bound) . For any tolerance $\\delta > 0$,\n",
    "$$\n",
    "E_{out}(g)\\le E_{in}(g)+\\sqrt {\\frac 8 N ln{\\frac {4m_H(2N)}\\delta}}\n",
    "$$\n",
    "with probability$\\ge1 -\\delta$.\n",
    "\n",
    "令\n",
    "$$\n",
    "\\sqrt {\\frac 8 N ln{\\frac {4m_H(2N)}\\delta}}=\\epsilon \n",
    "$$\n",
    "那么\n",
    "$$\n",
    "\\frac 8 N ln{\\frac {4m_H(2N)}\\delta}=\\epsilon^2\\\\\n",
    "ln{\\frac {4m_H(2N)}\\delta}=\\frac {N\\epsilon^2}8\\\\\n",
    "\\frac {4m_H(2N)}\\delta=e^{\\frac {N\\epsilon^2}8}\\\\\n",
    "\\delta=\\frac {4m_H(2N)}{e^{\\frac {N\\epsilon^2}8}}\n",
    "$$\n",
    "对于此题来说\n",
    "$$\n",
    "\\epsilon=0.1,N=100,m_H(N) = N+1\n",
    "$$\n",
    "带入计算得$\\delta=709.5275096780147$，所以概率大于等于$-708.5275096780147$，这个结果太宽松了，等于没说。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709.5275096780147"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import math\n",
    "def m(n):\n",
    "    return n+1\n",
    "\n",
    "def delta(N,epsilon):\n",
    "    return 4*m(2*N)/(math.exp(N*epsilon**2/8))\n",
    "\n",
    "delta(100,0.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Exercise 2.6 (Page 60)\n",
    "A data set has 600 examples. To properly test the performance of the final hypothesis, you set aside a randomly selected subset of 200 examples which are never used in the training phase; these form a test set. You use a learning model with 1,000 hypotheses and select the final hypothesis $g$ based on the 400 training examples. We wish to estimate $E_{out}(g)$. We have access to two estimates: $E_{in}(g)$, the in sample error on the 400 training examples; and, $E_{test}(g)$, the test error on the 200 test examples that were set aside.\n",
    "\n",
    "(a) Using a 5% error tolerance ($\\delta = 0.05$), which estimate has the higher 'error bar' ?  \n",
    "(b) Is there any reason why you shouldn 't reserve even more examples for testing?\n",
    "\n",
    "\n",
    "(a)这里要对$Hoeffding$不等式稍作变形\n",
    "$$\n",
    "P[|E_{in}(g)-E_{out}(g)|>\\epsilon]\\le 2M e^{-2\\epsilon ^2N}\n",
    "$$\n",
    "令$ 2M e^{-2\\epsilon^2N}=\\delta $，那么$\\epsilon=\\sqrt{\\frac 1 {2N}ln{\\frac {2M}\\delta}}$\n",
    "因此有$1-\\delta$的概率使得\n",
    "$$\n",
    "E_{out}(g)\\le E_{in}(g)+\\sqrt{\\frac 1 {2N}ln{\\frac {2M}\\delta}}\n",
    "$$\n",
    "\n",
    "在这题中,$M=1000,N_1=400,N_2=200,\\delta=0.05$，所以$E_{test}(g)$的'error bar'更大\n",
    "\n",
    "(b)如果测试集过多的话，会使得训练集较少，这样训练出来的结果就比较差"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Exercise 2.7 (Page 62)\n",
    "For binary target functions, show that $P[h(x)\\ne  f(x)]$ can be written as an expected value of a mean squared error measure in the following cases.\n",
    "\n",
    "(a) The convention used for the binary function is $0$ or $1$\n",
    "(b) The convention used for the binary function is $±1$\n",
    "[int: The difference between (a) and (b) is just a scale.\n",
    "\n",
    "这题是要将之前离散情况的误差函数改写为平方误差函数。\n",
    "\n",
    "(a)注意此时$h(x)\\ne  f(x)$要么是$h(x)=1,f(x)=0$或者$h(x)=0,f(x)=1$\n",
    "因此\n",
    "$$\n",
    "P[h(x)\\ne  f(x)]=P(|h(x)-f(x)|=1)\n",
    "$$\n",
    "而\n",
    "$$\n",
    "E((h(x)-f(x))^2)=1\\times P(|h(x)-f(x)|=1)+0\\times P(|h(x)-f(x)|=0)=P(|h(x)-f(x)|=1)\n",
    "$$\n",
    "所以\n",
    "$$\n",
    "P[h(x)\\ne  f(x)]=E((h(x)-f(x))^2)\n",
    "$$\n",
    "\n",
    "(a)注意此时$h(x)\\ne  f(x)$要么是$h(x)=1,f(x)=-1$或者$h(x)=-1,f(x)=1$\n",
    "因此\n",
    "$$\n",
    "P[h(x)\\ne  f(x)]=P(|h(x)-f(x)|=2)\n",
    "$$\n",
    "而\n",
    "$$\n",
    "E((h(x)-f(x))^2)=4\\times P(|h(x)-f(x)|=2)+0\\times P(|h(x)-f(x)|=0)=4P(|h(x)-f(x)|=2)\n",
    "$$\n",
    "所以\n",
    "$$\n",
    "P[h(x)\\ne  f(x)]=\\frac 1 4E((h(x)-f(x))^2)\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#### Exercise 2.8 (Page 63)\n",
    "(a) Show that if $H$ is closed under linear combination (any linear combination of hypotheses in $H$ is also a hypothesis in $H$), then $\\overline g \\in H$ .  \n",
    "(b) Give a model for which the average function $\\overline g$ is not in the model's hypothesis set. [int: Use a very simple model.]  \n",
    "(c) For binary classification, do you expect $\\overline g$ to be a binary function?  \n",
    "\n",
    "(a)$\\overline g(x) =\\frac 1 K \\sum_{k=1}^Kg_k(x)$,所以如果$H$在线性运算下封闭，那么$\\overline g \\in H$\n",
    "\n",
    "(b)考虑一个二元分类问题，第一组数据为全0，这样得出来的假设为$g_1(x)=0$，第二组数据全为1，这样得出来的假设为$g_2(x)=1$，$H=\\{1,0\\}$,但是$\\overline g(x)=\\frac 1 2(g_1(x)+g_2(x))$显然不属于$H$\n",
    "\n",
    "(c)对于二元分类问题，肯定不希望$\\overline g$是一个binary function，否则之后的数据要么全分为，要么全分为1，效果太差"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Part 2:Probelms"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.1 (Page 69) \n",
    "In Equation (2. 1), set $\\delta = 0.03$ and let\n",
    "$$\n",
    "\\epsilon(M,N,\\delta)=\\sqrt{\\frac 1 {2N}ln\\frac{2M}\\delta}\n",
    "$$\n",
    "(a) For $M = 1$ , how many examples do we need to make $\\epsilon \\le0.05$?  \n",
    "(b) For$ M = 100$, how many exam ples do we need to make $\\epsilon \\le0.05$?  \n",
    "(c) For $M = 10, 000$, how many exam ples do we need to make $\\epsilon \\le0.05$?  \n",
    "\n",
    "对等式稍作变形:\n",
    "$$\n",
    "\\epsilon^2=\\frac 1 {2N}ln\\frac{2M}\\delta\\\\\n",
    "2N=\\frac{ln\\frac{2M}\\delta}{\\epsilon^2}\\\\\n",
    "N=\\frac{ln\\frac{2M}\\delta}{2\\epsilon^2}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from math import log\n",
    "\n",
    "delta = 0.03\n",
    "def f(M,epsilon):\n",
    "    return log(2*M/delta)/(2*epsilon**2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "839.9410155759853"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(1,0.05)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1760.9750527736032"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(100,0.05)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2682.0090899712213"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(10000,0.05)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "所以  \n",
    "(a)839.9410155759853  \n",
    "(b)1760.9750527736032  \n",
    "(c)2682.0090899712213"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.2 (Page 69)\n",
    "Show that for the learning model of positive rectangles (aligned horizontally or vertically), $m_H (4) = 2^4$ and $m_H (5) < 2^5$ . Hence, give a bound for $ m_H (N)$ .\n",
    "\n",
    "题目给出的学习模型是两条平行于x轴的直线或者两条平行于y轴的直线。$m_H (4) = 2^4$这个比较简单，画图就可以了。$m_H (5) < 2^5$可以通过下图来看。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nDElSk/8H3eTp5VeJ/DAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1e3bd452c18>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.scatter([1,2,4],[0,0,0])\n",
    "plt.scatter([0,3],[0,0])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "显然这种情形无法被水平或者竖直的矩形分类，因此$m_H (5) < 2^5$。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "将二维平面每个点投影到x轴上以及y轴上，二维平面上的点能被表出当且仅当在x轴上的投影点能被表出或者y轴上的投影点能被表出。设在x轴上一共能表出的情形为$f(N)$，x轴和y轴是对称的，因此$m_H(N)\\le 2f(N)$（这个估计还是比较粗糙的，但是准确的估计暂时没想出来）。在x轴上，一共有以下两种情形:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1e3c1a7f550>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.scatter([1,2],[0,0])\n",
    "plt.scatter([0,3,4],[0,0,0])\n",
    "plt.plot([0.5,0.5],[-1,1],color='red')\n",
    "plt.plot([2.5,2.5],[-1,1],color='red')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1e3c18cc358>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.scatter([1,2],[0,0])\n",
    "plt.scatter([3,4],[0,0])\n",
    "plt.plot([0.5,0.5],[-1,1],color='red')\n",
    "plt.plot([2.5,2.5],[-1,1],color='red')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一种情形为矩形两侧都有元素，这种情形不考虑全-1或者全1的情况，所以这种情形共有$2C_{N-1}^2=(N-1)(N-2)$，乘以2是因为矩形内部可以为-1，也可以为1。  \n",
    "第二种情形为矩形只有一侧有元素，这种情形共有$2(N+1)-2=2N$，减2是因为全1或者全 -1的情形被重复算了。\n",
    "\n",
    "因此\n",
    "$$\n",
    "f(N)\\le (N-1)(N-2)+2N=N^2-N+2\\\\\n",
    "m_H(N)\\le 2f(N)=2N^2-2N+4\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.3 (Page 69) \n",
    "Compute the maximum number of dichotomies, $m_H (N)$,for these learning models, and consequently compute $d_{vc}$ , the VC dimension.  \n",
    "(a) Positive or negative ray: $H$ contains the functions which are + 1 on $[a, +\\infty)$(for some a) together with those that are +1 on $( - \\infty , a]$ (for some a).  \n",
    "(b) Positive or negative interval : $H$ contains the functions which are + 1 on an interval $[a, b]$ and -1 elsewhere or -1 on an interval $[a, b]$ and +1 elsewhere.  \n",
    "(c) Two concentric spheres in $R^d$: $H$ contains the functions which are +1 for $a \\le \\sqrt {x_1^2 + . . . + x_d^2}\\le b$.\n",
    "\n",
    "计算$m_H (N)$以及$d_{vc}$  \n",
    "(a)这题其实就相当于在$N$个点中画了一条直线，左边的为-1，右边的为1，或者左边的为1，右边的为-1，除去全1和全-1的情形，一共有$2(N-1)$种，那么加上全-1和全1，一共有$2N-2+2=2N$种情形。因此\n",
    "$$\n",
    "m_H (N)=2N,d_{vc}=2\n",
    "$$\n",
    "(b)这题就是我们上一题给出上界的那种假设，具体的可以参考那一题。因此\n",
    "$$\n",
    "m_H (N)=N^2-N+2,d_{vc}=3\n",
    "$$\n",
    "(c)做映射$y=\\sqrt {x_1^2 + . . . + x_d^2}$，所以这个问题可以化为类似(b)的问题(注意这里不同之处在于$[a,b]$区间内的元素只能为$+1$)。但用我之前的思路考虑比较麻烦，这里用另一种思路。注意这里两圆之间的部分为$+1$，因此问题为$d$个点之间以及两侧$d+1$个间隔中挑选2个，最后要需要考虑全$-1$的情形，因此\n",
    "$$\n",
    "m_H (N)=C_{N+1}^2+1=\\frac{N(N+1)}2+1,d_{vc}=2\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.4 (Page 69)\n",
    "Show that $B(N, k) =\\sum_{i=0}^{k-1}\\binom N i$ by showing the other\n",
    "direction to Lemma 2.3, namely that\n",
    "$$\n",
    "B(N, k) \\ge\\sum_{i=0}^{k-1}\\binom N i\n",
    "$$\n",
    "To do so, construct a specific set of $\\sum_{i=0}^{k-1}\\binom N i$ dichotomies that does not shatter any subset of $k$ variables. [Hint: Try limiting the number of -1 's in each dichotomy]\n",
    "\n",
    "考虑$N$个元素的点集，点集中最多有$k-1$个$-1$，那么这样的点集有$\\sum_{i=0}^{k-1}\\binom N i$种。考虑$k$个元素的子集，然么$(-1,-1...-1)$(全为$-1$的情形)必然无法被表出，因为最多有$k-1$个点为$-1$。那么由$B(N,k)$的定义知\n",
    "$$\n",
    "B(N, k) \\ge\\sum_{i=0}^{k-1}\\binom N i\n",
    "$$\n",
    "因此\n",
    "$$\n",
    "B(N, k) =\\sum_{i=0}^{k-1}\\binom N i\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.5 (Page 69)\n",
    "Prove by induction that $\\sum_{i=0}^{D}\\binom N i\\le N^D+1$ , hence\n",
    "$$\n",
    "m_H(N)\\le N^{d_{vc}}+1\n",
    "$$\n",
    "\n",
    "使用数学归纳法。  \n",
    "$D=0$时，$\\sum_{i=0}^{D}\\binom N i=1$，$N^D+1=1+1=2$\n",
    "所以$D=0$时，不等式成立。  \n",
    "假设$D=k$时不等式成立，$D=k+1$时\n",
    "$$\n",
    "\\sum_{i=0}^{k+1}\\binom N i=\\sum_{i=0}^{k}\\binom N i+\\binom N {k+1}\\le N^k+1+\\binom N {k+1}\n",
    "$$\n",
    "对$\\binom N {k+1}$进行放缩\n",
    "$$\n",
    "\\binom N {k+1}=\\frac{N(N-1)...(N-k)}{(k+1)!}\\le N(N-1)...(N-k)\\le N^k(N-1)\n",
    "$$\n",
    "因此\n",
    "$$\n",
    "\\begin{aligned}\n",
    "\\sum_{i=0}^{k+1}\\binom N i&\\le N^k+1+\\binom N {k+1}\n",
    "\\\\& \\le N^k+1+N^k(N-1)\n",
    "\\\\&=N^{k+1}+1\n",
    "\\end{aligned}\n",
    "$$\n",
    "所以对$D=k+1$时不等式也成立。\n",
    "由之前结论我们知道\n",
    "$$\n",
    "m_H(N)\\le \\sum_{i=0}^{d_{vc}}\\binom N i\n",
    "$$\n",
    "那么\n",
    "$$\n",
    "m_H(N)\\le \\sum_{i=0}^{d_{vc}}\\binom N i\\le N^{d_{vc}}+1\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.6 (Page 70)\n",
    "Prove that for $N \\ge d$,\n",
    "$$\n",
    "\\sum_{i=0}^{d}\\binom N i\\le (\\frac {eN}d )^d\n",
    "$$\n",
    "We suggest you first show the following intermediate steps.  \n",
    "(a) $\\sum_{i=0}^{d}\\binom N i\\le \\sum_{i=0}^{d}\\binom N i(\\frac N d)^{d-i}\\le (\\frac N d)^d\\sum_{i=0}^{N}\\binom N i(\\frac d N)^i$  \n",
    "(b) $\\sum_{i=0}^{N}\\binom N i(\\frac d N)^i\\le e^d$[Hints: Binomial theorem;$(1+\\frac 1 x)^x \\le e$ for $x\\ge 0$\n",
    "Hence, argue that $m_H(N)\\le (\\frac {eN}{d_{vc}} )^{d_{vc}}$\n",
    "\n",
    "(a)因为$N\\ge d,d\\ge i$，所以$(\\frac N d)^{d-i}\\ge 1$\n",
    "那么\n",
    "$$\n",
    "\\sum_{i=0}^{d}\\binom N i\\le \\sum_{i=0}^{d}\\binom N i(\\frac N d)^{d-i}=(\\frac N d)^d \\sum_{i=0}^{d}\\binom N i (\\frac d N)^{i}\\le (\\frac N d)^d\\sum_{i=0}^{N}\\binom N i(\\frac d N)^i\n",
    "$$\n",
    "最后一步由$d\\le N$\n",
    "\n",
    "(b)由二项式定理\n",
    "$$\n",
    "\\sum_{i=0}^{N}\\binom N i(\\frac d N)^i=\\sum_{i=0}^{N}\\binom N i(\\frac d N)^i1^{N-i}=(1+\\frac dN)^N\n",
    "$$\n",
    "由$(1+\\frac 1 x)^x \\le e$，我们知道\n",
    "$$\n",
    "(1+\\frac dN)^N=(1+\\frac dN)^{\\frac N d d}\\le e^d\n",
    "$$\n",
    "因此\n",
    "$$\n",
    "\\sum_{i=0}^{N}\\binom N i(\\frac d N)^i=(1+\\frac dN)^N\\le e^d\\\\\n",
    "\\sum_{i=0}^{d}\\binom N i\\le (\\frac N d)^d\\sum_{i=0}^{N}\\binom N i(\\frac d N)^i\\le (\\frac N d)^d e^d=(\\frac {eN}d )^d\n",
    "$$\n",
    "\n",
    "由之前结论我们知道\n",
    "$$\n",
    "m_H(N)\\le \\sum_{i=0}^{d_{vc}}\\binom N i\n",
    "$$\n",
    "那么由这题的结论可得\n",
    "$$\n",
    "m_H(N)\\le (\\frac {eN}{d_{vc}} )^{d_{vc}}\n",
    "$$\n",
    "\n",
    "这题和之前一题都是对$m_H(N)$给出一个多项式上界。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.7 (Page 70)\n",
    "Plot the bounds for $m_H (N)$ given in Problems 2.5 and 2.6\n",
    "for $d_{vc} = 2$ and $d_{vc} = 5$. When do you prefer one bound over the other?\n",
    "\n",
    "作图题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "\n",
    "def f1(N,d):\n",
    "    return N**d+1\n",
    "\n",
    "def f2(N,d):\n",
    "    return (math.exp(1)*N/d)**d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1e3c0266ba8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n=range(1,50)\n",
    "m1=[f1(i,2) for i in n]\n",
    "m2=[f2(i,2) for i in n]\n",
    "\n",
    "plt.plot(n,m1,label='f1')\n",
    "plt.plot(n,m2,label='f2')\n",
    "plt.legend()\n",
    "plt.title('dvc=2')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1e3c1bf56d8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n=range(1,50)\n",
    "m1=[f1(i,5) for i in n]\n",
    "m2=[f2(i,5) for i in n]\n",
    "\n",
    "plt.plot(n,m1,label='f1')\n",
    "plt.plot(n,m2,label='f2')\n",
    "plt.legend()\n",
    "plt.title('dvc=5')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上图中，f1表示2.5得到的上界，f2表示2.6得到的上界，可以看到，当$d_{vc}=2$时，2.5得到的上界要明显好于2.6得到的上界，而当$d_{vc}=5$时，2.6得到的上界要明显好于2.5得到的上界，我们来简单分析下原因。  \n",
    "2.5得到的上界\n",
    "$$\n",
    "N^{d_{vc}}+1\n",
    "$$\n",
    "2.6得到的上界\n",
    "$$\n",
    "(\\frac {eN}{d_{vc}} )^{d_{vc}}\n",
    "$$\n",
    "当$d_{vc}=2$时，$\\frac {e}{d_{vc}}>1$，所以当N充分大时，$(\\frac {eN}{d_{vc}} )^{d_{vc}}$明显大于$N^{d_{vc}}+1$\n",
    "而当$d_{vc}=5$时，$\\frac {e}{d_{vc}}<1$，所以当N充分大时，$(\\frac {eN}{d_{vc}} )^{d_{vc}}$明显小于$N^{d_{vc}}+1$\n",
    "\n",
    "所以当$d_{vc}\\le 2$时，选$N^{d_{vc}}+1$作为上界，其余情形选择$\n",
    "(\\frac {eN}{d_{vc}} )^{d_{vc}}$作为上界。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.8 (Page 70)\n",
    "Which of the following are possible growth functions $m_H (N)$for some hypothesis set:\n",
    "$$\n",
    "1+N;1+ N +\\frac {N(N - 1)} 2;2^N;2^{\\lfloor \\sqrt N \\rfloor} ;2^{\\lfloor \\frac N 2 \\rfloor};1+N+\\frac {N(N-1)(N-2)} 6\n",
    "$$\n",
    "\n",
    "我们知道$m_H (N)$要么等于$2^N$，要么有一个多项式的上界，根据这两点，除了$2^{\\lfloor \\sqrt N \\rfloor},2^{\\lfloor \\frac N 2 \\rfloor}$以外，其余函数均有可能成为$m_H (N)$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.9 (Page 70)\n",
    "[hard] For the perceptron in $d$ dimensions, show that\n",
    "$$\n",
    "m_H(N)=2\\sum_{i=0}^d \\binom {N-1} i\\\\\n",
    "{Hint: Cover(1965)\\ in\\ Further\\ Reading.}\n",
    "$$\n",
    "Use this formula to verify that $d_{vc} = d + 1$ by evaluating $m_H(d + 1)$ and $m_H(d + 2)$ . Plot $m_H(N)/2N$ for $d = 10$ and $N \\in [1, 40]$ . If you generate a random dichotomy on $N$ points in 10 dimensions, give an upper bound on the probability that the dichotomy will be separable for N = 10, 20, 40."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这题比较难，我也是查阅了网上资料才思考出来。[参考资料](http://web.mit.edu/course/other/i2course/www/vision_and_learning/perceptron_notes.pdf)\n",
    "\n",
    "为了后续叙述方便，记$N$个数据，维度为$d$的$m_H(N)$为$f(N,d)$，我们考虑$f(N,d)$的递推关系。\n",
    "\n",
    "假设$B=\\{(b_1,b_2...b_N),b_i \\in \\{1,-1\\}\\}$是维度$d$,$N$个点所有可以被表示出来的组合，也就是说$\\forall (b_1,b_2...b_N) \\in B,\\exists w\\in R^d,(x_1,x_2...x_N),(x_i\\in R^d)$使得\n",
    "$$\n",
    "(sign(w^Tx_1),sign(w^Tx_2)...sign(w^Tx_N))=(b_1,b_2...b_N)\n",
    "$$\n",
    "那么此时增加一个点$x_{N+1}$\n",
    "$$\n",
    "(sign(w^Tx_1),sign(w^Tx_2)...sign(w^Tx_N),sign(w^Tx_{N+1}))=(b_1,b_2...b_N,sign(w^Tx_{N+1}))\n",
    "$$\n",
    "现在考虑以下两种情况：\n",
    "\n",
    "- 情形1\n",
    "  $w^Tx_{N+1}!=0$,那么$或sign(w^Tx_{N+1})=1或$${-}1$,那么$(b_1,b_2...b_N,sign(w^Tx_{N+1}))$可以直接被表示出来，记满足这个条件的数量为$C_1$\n",
    "\n",
    "- 情形2\n",
    "  $w^Tx_{N+1}=0$,那么此时需要对$w$进行旋转，可以进行如下处理。\n",
    "\n",
    "  令$t={max}|x_{N+1}^Tx_i|(i=1...N),M={min}|w^Tx_i|(i=1...N),k=\\frac M {2t}$\n",
    "  那么对于$w_1=w \\pm k y$\n",
    "\n",
    "$$\n",
    "w_1^Tx_i=(w\\pm kx_{N+1})^Tx_i=w^Tx_i\\pm kx_{N+1}^Tx_i\\\\\n",
    "|kx_{N+1}^Tx_i|=|\\frac M {2t}x_{N+1}^Tx_i|=\\frac M {2t}|x_{N+1}^Tx_i|\\le \\frac M{2t}\\times t=\\frac M 2\\le\\frac {|w^Tx_i|}2\n",
    "$$\n",
    "\n",
    "  对于任何非零的数$a$，$a\\pm\\frac{|a|}2$与$a$同号，那么$w_1^Tx_i$与$w^Tx_i$同号。再来观察$w_1^Tx_{N+1}$的符号，注意$w^Tx_{N+1}=0$\n",
    "$$\n",
    "w_1^Tx_{N+1}=(w \\pm k x_{N+1})^Tx_{N+1}=w^Tx_{N+1} \\pm k x_{N+1}^Tx_{N+1}=\\pm k x_{N+1}^Tx_{N+1}\n",
    "$$\n",
    "  所以当$w_1=w + k y$时,$w_1^Ty>0$,当$w_1=w - k y$时,$w_1^Ty<0$  \n",
    "  综上所述，当$w^Tx_{N+1}=0$时，通过旋转$w$，$(b_1,b_2...b_N,\\pm1)$均可以被表示出来，记满足这个条件的数量为$C_2$\n",
    "\n",
    "接下来分析$C_1$以及$C_2$。首先看$C_2$，$C_2$是有一个约束条件$w^Tx_{N+1}=0$下的最大可表示出来的数量，所以这相当于$d-1$维（有一个约束条件，所以减小一个维度）下$N$个点的最大可表示出来的数量乘以2（$sign(w^Tx_{N+1})$可正可负），也就是说$C_2=2f(N,d-1)$。而$C_1$相当于所有$f(N,d)$减去满足$w^Tx_{N+1}=0$条件下的表示数量$f(N,d-1)$，$C_1=f(N,d)-f(N,d-1)$\n",
    "\n",
    "因此\n",
    "$$\n",
    "f(N+1,d)=C_1+C_2=2f(N,d-1)+f(N,d)-f(N,d-1)=f(N,d)+f(N,d-1)\n",
    "$$\n",
    "其余的步骤由数学归纳法即可。\n",
    "$$\n",
    "f(N+1,d)=f(N,d)+f(N,d-1)=2\\sum_{i=0}^d \\binom {N-1}i+2\\sum_{i=0}^{d-1} \\binom {N-1}i\n",
    "$$\n",
    "我们知道$\\binom n k=\\binom {n-1} k+\\binom {n-1} {k-1}$。因此\n",
    "$$\n",
    "\\begin{aligned}\n",
    "f(N+1,d)&=2\\sum_{i=0}^d \\binom {N-1}i+2\\sum_{i=0}^{d-1} \\binom {N-1}i\\\\\n",
    "&=2+2\\sum_{i=1}^d \\binom {N-1}i+2\\sum_{i=0}^{d-1} \\binom {N-1}i\\\\\n",
    "&=2+2\\sum_{i=1}^d \\binom {N-1}i+2\\sum_{i=1}^{d} \\binom {N-1}{i-1}\\\\\n",
    "&=2+2\\sum_{i=1}^d \\binom {N}i\\\\\n",
    "&=2\\sum_{i=0}^d \\binom {N}i\n",
    "\\end{aligned}\n",
    "$$\n",
    "因此结论成立。\n",
    "\n",
    "下面计算下$d_{vc}$\n",
    "$$\n",
    "m_H(d+1)=2\\sum_{i=0}^d \\binom {d} i=2^{d+1}\\\\\n",
    "m_H(d+2)=2\\sum_{i=0}^d \\binom {d+1} i=2(2^{d+1}-1)=2^{d+2}-2<2^{d+2}\n",
    "$$\n",
    "所以$d_{vc}=d+1$，这也符合我们之前的论述。\n",
    "\n",
    "剩余部分是作图，注意这里的概率其实就是$\\frac {m_H(N)} {2^N}$，因为一共有$2^N$种，而可表示出来的一共有$m_H(N)$种"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from scipy.special import comb\n",
    "def m(N,d):\n",
    "    result=0\n",
    "    k=min(d,N-1)\n",
    "    for i in range(k+1):\n",
    "        result+=comb(N-1,i)\n",
    "    return 2*result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x=range(1,41)\n",
    "d=10\n",
    "y=[m(i,d)/2**i for i in x]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1e3c36c1a90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.plot(x,y)\n",
    "plt.xlabel('N')\n",
    "plt.ylabel('mH(N)/2**N')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.0, 0.67619705200195313, 0.0016889239559532143]\n"
     ]
    }
   ],
   "source": [
    "print([m(i,d)/2**i for i in [10,20,40]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "概率如上所示，可以看到对于$d=10$，只要有40个点就几乎不可能表出了"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#### Problem 2.10 (Page 70)\n",
    "\n",
    "Show that $m_H(2N) \\le m_H (N)^2 $, and hence obtain a generaIization bound which only involves $m_H (N) $\n",
    "\n",
    "将$2N$个点分为前$N$个和后$N$个，记前$N$个点的区分方法为$f_1(N)$,后$N$个点的区分方法为$f_2(N)$,由乘法原理，$m_H(2N)\\le f_1(N)\\times f_2(N)$，显然$f_1(N)\\le m_H(N),f_2(N)\\le m_H(N)$。因此\n",
    "$$\n",
    "m_H(2N) \\le m_H (N)^2\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.11 (Page 70)\n",
    "\n",
    "Suppose $m_H(N) = N + 1$, so $d_{vc} = 1$ . You have 100 training examples. Use the generalization bound to give a bound for $E_{out}$ with confidence 90%. Repeat for $N = 10, 000$.    \n",
    "\n",
    "这题要使用上面证明的不等式，先回顾下书本第58页的公式\n",
    "$$\n",
    "E_{out}(g)\\le E_{in}(g)+\\sqrt {\\frac 8 N ln(\\frac {4m_H({2N})} \\delta )}的概率大于等于1-\\delta\n",
    "$$\n",
    "对这题来说，$\\delta=0.1$。回顾上题的不等式可得：\n",
    "$$\n",
    "\\sqrt {\\frac 8 N ln(\\frac {4m_H({2N})} \\delta )}\\le\\sqrt {\\frac 8 Nln(\\frac{4 m_H (N)^2}\\delta)}\n",
    "$$\n",
    "下面计算下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import math\n",
    "\n",
    "delta=0.1\n",
    "\n",
    "def f(N):\n",
    "    return (8/N*math.log(4*(N+1)**2/delta))**0.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.016626597637361"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.13299551928713077"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.12 (Page 71)\n",
    "\n",
    "For an $H$ with $d_{vc} = 10$, what sample size do you need (as prescribed by the generalization bound) to have a 95% confidence that your generalization error is at most 0.05? \n",
    "\n",
    "在此回顾下课本58页的公式\n",
    "$$\n",
    "E_{out}(g)\\le E_{in}(g)+\\sqrt {\\frac 8 N ln(\\frac {4({(2N)}^{d_{vc}}+1)} \\delta )}的概率大于等于1-\\delta\n",
    "$$\n",
    "回到这题，题目中$\\delta =0.05,\\sqrt {\\frac 8 N ln(\\frac {4({(2N)}^{d_{vc}}+1)} \\delta )}=0.05$\n",
    "这个方程直接解的话不好解，可以作图看一下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "452957\n"
     ]
    }
   ],
   "source": [
    "import math\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "delta=0.05\n",
    "dvc=10\n",
    "\n",
    "def f(N):\n",
    "    return (8/N*math.log(4*((2*N)**dvc+1)/delta))**0.5-0.05\n",
    "\n",
    "n=1\n",
    "while(True):\n",
    "    if(f(n)<=0):\n",
    "        break\n",
    "    else:\n",
    "        n+=1\n",
    "\n",
    "print(n)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到这个数字非常大，我们再来作图看一下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x280e9109e10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x=range(1,1000)\n",
    "y=[f(i) for i in x]\n",
    "\n",
    "plt.plot(x,y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#### Problem 2.13 (Page 71)\n",
    "\n",
    " (a) Let $H = \\{h_1 , h_2 , . . . , h_M\\}$ with some finite $M$. Prove that $d_{vc}(H) \\le log_2 M. $\n",
    "\n",
    "(b) For hypothesis sets $H_1,H_2,...,H_k$ with finite VC dimensions $d_{vc}(H_k)$, derive and prove the tightest upper and lower bound that you can get on $dvc (\\cap _{k=1}^KH_k) $· \n",
    "\n",
    "(c) For hypothesis sets $H_1,H_2,...,H_k$ with finite VC dimensions $d_{vc}(H_k)$, derive and prove the tightest upper and lower bounds that you can get on $d_{vc} (\\cup _{k=1}^KH_k) $·   \n",
    "\n",
    "(a)因为有$M$个假设，所以一共能区分$M$ 种情况，$d_{vc}(H)$表示对于$n=d_{vc}(H)$组数据，这$M$个假设可以区分出来所有$2^{d_{vc}(H)}$种情形，而一共最多能区分$M$种情形，因此\n",
    "$$\n",
    "2^{d_{vc}(H)}\\le M\\\\\n",
    "d_{vc}(H)\\le log_2(M)\n",
    "$$\n",
    "(b)首先有直觉反应：\n",
    "$$\n",
    "如果A\\subseteq B,那么d_{vc}(A)\\le d_{vc}(B)\n",
    "$$\n",
    "所以猜测\n",
    "$$\n",
    "0\\le dvc (\\cap _{k=1}^KH_k)\\le {min}\\{(d_{vc}(H_k))\\}_{k=1}^K\n",
    "$$\n",
    "$0\\le dvc (\\cap _{k=1}^KH_k)$是显然的，另一边使用反证法，记$d_1=dvc (\\cap _{k=1}^KH_k),d_2={min}\\{(d_{vc}(H_k))\\}_{k=1}^K$\n",
    "\n",
    "若$d_1\\ge d_2+1$，那么$\\cap _{k=1}^KH_k$可以shatter $d_2+1$个点，那么至少存在一个$H_i(i=1...k)$，使得$H_i$也可以shatter $d_2+1$个点，这就与$d_2={min}\\{(d_{(vc)}(H_k))\\}_{k=1}^K$相矛盾了，所以\n",
    "$$\n",
    "dvc (\\cap _{k=1}^KH_k)\\le {min}\\{(d_{vc}(H_k))\\}_{k=1}^K\n",
    "$$\n",
    "并且是最强上界。\n",
    "\n",
    "接着这个思路，也可以把一下结论证明一下。\n",
    "$$\n",
    "如果A\\subseteq B,那么d_{vc}(A)\\le d_{vc}(B)\n",
    "$$\n",
    "反正法，如果$d_{vc}(A)\\ge d_{vc}(B)+1$，那么$A$可以shatter $d_{vc}(B)+1$个点，由$A\\subseteq B$。那么$B$也可以shatter $d_{vc}(B)+1$个点，矛盾。因此该结论成立。\n",
    "\n",
    "(c)这题参考了别人的笔记，[笔记地址](http://beader.me/mlnotebook/section2/vc-dimension-three.html)\n",
    "\n",
    "这题说实话要不是之前做过林老师的作业，结论我是猜不出的，所以这里就直接证明了，先上结论。\n",
    "$$\n",
    "{max}\\{d_{vc}(H_k)\\}_{k=1}^K\\le d_{vc} (\\cup _{k=1}^KH_k)\\le K-1+\\sum_{k=1}^K d_{vc} (H_k)\n",
    "$$\n",
    "左边比较简单，由之前的结论即可。\n",
    "$$\n",
    "因为H_k \\subseteq \\cup _{k=1}^KH_k\\\\\n",
    "所以d_{vc}(H_k)\\le d_{vc} (\\cup _{k=1}^KH_k)(k=1...K)\\\\\n",
    "{max}\\{d_{vc}(H_k)\\}_{k=1}^K\\le d_{vc} (\\cup _{k=1}^KH_k)\n",
    "$$\n",
    "观察下右边的形式，其实只要证明$K=2$的情形然后使用数学归纳法即可，下面记$d_1=d_{vc}(H_1),d_2=d_{vc}(H_2)$，考虑成长函数$m_H(N)$，首先\n",
    "$$\n",
    "m _ {H_1\\cup H_2}(N) \\le m_{H_1}(N)+ m_{H_2}(N)\n",
    "$$\n",
    "对于$N$个元素，$H_1\\cup H_2$最多可以表示出$m _ {H_1\\cup H_2}(N)$种分类，对于每种分类，或者由$H_1$表示，或者由$H_2$表示，所以$m _ {H_1\\cup H_2}(N)$应该小于$H_1$和$H_2$表示出来的分类之和。而$H_1$最多可以表示出$m_{H_1}(N)$种分类，$H_2$最多可以表示出$m_{H_2}(N)$种分类，因此上述不等式成立。\n",
    "\n",
    "回到原题，使用上述结论以及VC不等式，我们可得\n",
    "$$\n",
    "m _ {H_1\\cup H_2}(N) \\le m_{H_1}(N)+ m_{H_2}(N)\\le\\sum _ {i=0} ^ {d_1} \\binom{N}{i} + \\sum _ {i=0} ^ {d_2} \\binom{N}{i}\n",
    "$$\n",
    "接着我们使用反证法，如果\n",
    "$$\n",
    "d_{vc}(H_1 \\cup H_2)\\ge 2+d_{vc}(H_1)+d_{vc}(H_2)=d_1+d_2+2\n",
    "$$\n",
    "那么\n",
    "$$\n",
    "m _ {H_1\\cup H_2}(d_1+d_2+2)=2^{d_1+d_2+2}\n",
    "$$\n",
    "把$N=d_1+d_2+2$带入$\\sum _ {i=0} ^ {d_1} \\binom{N}{i} + \\sum _ {i=0} ^ {d_2} \\binom{N}{i}$得\n",
    "$$\n",
    "\\begin{aligned}\n",
    "\\sum _ {i=0} ^ {d_1} \\binom{N}{i} + \\sum _ {i=0} ^ {d_2} \\binom{N}{i}&=\\sum _ {i=0} ^ {d_1} \\binom{d_1+d_2+2}{i} + \\sum _ {i=0} ^ {d_2} \\binom{d_1+d_2+2}{i}\n",
    "\\\\&=\\sum _ {i=0} ^ {d_1} \\binom{d_1+d_2+2}{i} + \\sum _ {i=0} ^ {d_2} \\binom{d_1+d_2+2}{d_1+d_2+2-i}\n",
    "\\\\&令j=d_1+d_2+2-i，那么j的范围从d_1+2到d_1+d_2+2\n",
    "\\\\&=\\sum _ {i=0} ^ {d_1} \\binom{d_1+d_2+2}{i} + \\sum _ {j=d_1+2} ^ {d_1+d_2+2} \\binom{d_1+d_2+2}{j}\n",
    "\\\\&=2^{d_1+d_2+2}-\\binom{d_1+d_2+2}{d_1+1}\n",
    "\\\\&<2^{d_1+d_2+2}\n",
    "\\end{aligned}\n",
    "$$\n",
    "所以\n",
    "$$\n",
    "m _ {H_1\\cup H_2}(d_1+d_2+2)\\le\\sum _ {i=0} ^ {d_1} \\binom{d_1+d_2+2}{i} + \\sum _ {i=0} ^ {d_2} \\binom{d_1+d_2+2}{i}<2^{d_1+d_2+2}\n",
    "$$\n",
    "与之前所述矛盾。因此\n",
    "$$\n",
    "d_{vc}(H_1 \\cup H_2)\\le 1+d_{vc}(H_1)+d_{vc}(H_2)=d_1+d_2+1\\\\\n",
    "当K=2时，d_{vc} (\\cup _{k=1}^KH_k)\\le K-1+\\sum_{k=1}^K d_{vc} (H_k)成立\n",
    "$$\n",
    "假设$K=n$时不等式成立，$K=n+1$时\n",
    "$$\n",
    "\\begin{aligned}\n",
    "d_{vc} (\\cup _{k=1}^{n+1}H_k)&=d_{vc} ((\\cup _{k=1}^{n}H_k)\\cup H_{n+1})\n",
    "\\\\&\\le1+d_{vc} (\\cup _{k=1}^{n}H_k)+d_{vc}( H_{n+1})\n",
    "\\\\&\\le1+n-1+\\sum_{k=1}^n d_{vc} (H_k)+d_{vc}( H_{n+1})\n",
    "\\\\&=n+\\sum_{k=1}^{n+1} d_{vc} (H_k)\n",
    "\\end{aligned}\n",
    "$$\n",
    "因此$K=n+1$时不等式也成立"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.14 (Page 71)\n",
    "\n",
    "Let $\\mathcal{H}_1 , \\mathcal{H}_2, . . . , \\mathcal{H}_K$ be $K$ hypothesis sets with finite VC dimension $d_{vc}$· Let $\\mathcal{H}=\\mathcal{H}_1 \\cup \\mathcal{H}_2\\cup . . . \\cup\\mathcal{H}_K$ be the union of these models.\n",
    "\n",
    "(a) Show that $d_{vc}(\\mathcal{H}) < K(d_{vc} + 1)$. \n",
    "\n",
    "(b) Suppose that $l$ satisfies $2^l > 2Kl^{d_{vc}}$ . Show that $d_{vc}(\\mathcal{H})\\le l$. \n",
    "\n",
    "(c) Hence, show that \n",
    "$$\n",
    "d_{vc}(\\mathcal{H})\\le min(K(d_{vc} + 1), 7(d_{vc} + K) log_2 (d_{vc}K))\n",
    "$$\n",
    "That is, $d_{vc}(H) = O(max(d_{vc}, K) log_2 max(d_{vc}, K)) $is not too bad .    \n",
    "\n",
    "(a)使用上题证明的结论\n",
    "$$\n",
    "d_{vc} (\\cup _{k=1}^KH_k)\\le K-1+\\sum_{k=1}^K d_{vc} (H_k)\n",
    "$$\n",
    "将 $带入得\\mathcal{H}=\\mathcal{H}_1 \\cup {H}_2\\cup . . . \\cup{H}_K,d_{vc}(H_k)=d_{vc}(k=1,2...K)带入得$\n",
    "$$\n",
    "d_{vc}(\\mathcal{H})\\le K-1+Kd_{vc} < K(d_{vc} + 1)\n",
    "$$\n",
    "(b)先回顾一个不等式\n",
    "$$\n",
    "m_\\mathcal{H}(N)\\le N^{d_{vc}}+1\n",
    "$$\n",
    "这里对这个不等式再加个更宽的上界\n",
    "$$\n",
    "m_\\mathcal{H}(N)\\le N^{d_{vc}}+1\\le 2N^{d_{vc}}\n",
    "$$\n",
    "在Problem 2.13中我们说过一个结论\n",
    "$$\n",
    "m _ {\\mathcal{H}_1\\cup \\mathcal{H}_2}(N) \\le m_{\\mathcal{H}_1}(N)+ m_{\\mathcal{H}_2}(N)\n",
    "$$\n",
    "这个结论显然可以推广为$K$个集合的\n",
    "$$\n",
    "m _ {\\cup_{i=1}^K \\mathcal{H}_i}(N) \\le \\sum _{i=1}^Km_{\\mathcal{H}_i}(N)\n",
    "$$\n",
    "因此对这题来说，我们取$N$为条件中的$l$\n",
    "$$\n",
    "m_{\\mathcal{H}}(l)=m _ {\\cup_{i=1}^K \\mathcal{H}_i}(l)\\le\\sum _{i=1}^Km_{\\mathcal{H}_i}(l)\\le\\sum _{i=1}^K2l^{d_{vc}}=2Kl^{d_{vc}}\n",
    "$$\n",
    "最后一个不等式是因为$m_\\mathcal{H}(N)\\le N^{d_{vc}}+1\\le 2N^{d_{vc}}$,以及这题中的每个$\\mathcal{H_i}$的 VC dimension均为$d_{vc}$。这时我们来看下题目给的条件\n",
    "$$\n",
    "2^l > 2Kl^{d_{vc}}\n",
    "$$\n",
    "那么\n",
    "$$\n",
    "m_{\\mathcal{H}}(l)\\le2Kl^{d_{vc}}<2^l\n",
    "$$\n",
    "所以$\\mathcal{H}$无法shatter $l$个点，因此我们可以得到比题目中更强的结论\n",
    "$$\n",
    "d_{vc}(\\mathcal{H}) <l\n",
    "$$\n",
    "(c)由(a)我们知道\n",
    "$$\n",
    "d_{vc}(\\mathcal{H}) < K(d_{vc} + 1)\n",
    "$$\n",
    "由(b)我们知道，要证明\n",
    "$$\n",
    "d_{vc}(\\mathcal{H}) \\le7(d_{vc} + K) log_2 (d_{vc}K)=s\n",
    "$$\n",
    "我们只要验证\n",
    "$$\n",
    "2^s > 2Ks^{d_{vc}}\n",
    "\\\\或者取对数之后的情形\n",
    "\\\\s>1+log_2K+d_{vc}log_2s\n",
    "$$\n",
    "为了叙述方便，这里令$d_{vc}=x,K=y,s=7(d_{vc} + K) log_2 (d_{vc}K)=7(x+y)log_2 (xy)$。所以上述式子化为\n",
    "$$\n",
    "2^s > 2ys^x\\\\\n",
    "s>1+log_2y+xlog_2s\n",
    "$$\n",
    "不失一般性，这里只考虑$K=y\\ge2,s\\ge2$的情形\n",
    "\n",
    "先考虑$d_{vc}=x=1$的情形，那么此时$s=7(1+y)log_2(y)$，我们只要验证$2^s>2ys$即可。由二项式定理\n",
    "$$\n",
    "2^s=(1+1)^s\\ge s+\\frac {s(s-1)}2>\\frac {s^2}2=\\frac {s(7(1+y)log_2(y))}2\n",
    "$$\n",
    "由$y\\ge2$，我们知道$log_2(y)\\ge1$。因此\n",
    "$$\n",
    "2^s>\\frac {s(7(1+y)log_2(y))}2\\ge \\frac{s(7(1+y))}2> \\frac{s(4y)}2=2ys\n",
    "$$\n",
    "因此$d_{vc}=x=1$时结论成立。\n",
    "\n",
    "接下来考虑$d_{vc}=x\\ge2$的情形，此时$s=7(x + y) log_2 (xy)$，接下来我们要验证\n",
    "$$\n",
    "s>1+log_2y+xlog_2s\n",
    "$$\n",
    "首先有俩个很显然的结论\n",
    "$$\n",
    "log_a(log_ax)\\le log_a(x)\\\\\n",
    "当y\\ge2时，7(x+y)<(xy)^6(x,y均为正整数)\n",
    "$$\n",
    "这个结论后面的论述中会使用。\n",
    "$$\n",
    "\\begin{aligned}\n",
    "1+log_2y+xlog_2s&=log_2(2y)+xlog_2(7(x+y)log_2(xy))\n",
    "\\\\&\\le log_2(xy)+xlog_2(7(x+y))+xlog_2log_2(xy)（这一步是因为因为x\\ge2)\n",
    "\\\\&<  log_2(xy)+xlog_2((x+y)^6)+xlog_2(xy)（这一步是因为因为之前介绍的两个结论)\n",
    "\\\\&=log_2(xy)+7xlog_2(x+y)\n",
    "\\\\&<7ylog_2(xy)+7xlog_2(x+y)\n",
    "\\\\&=s\n",
    "\\end{aligned}\n",
    "$$\n",
    "因此结论成立，所以\n",
    "$$\n",
    "d_{vc}(\\mathcal{H}) \\le7(d_{vc} + K) log_2 (d_{vc}K)\n",
    "$$\n",
    "综上所述\n",
    "$$\n",
    "d_{vc}(\\mathcal{H})\\le min(K(d_{vc} + 1), 7(d_{vc} + K) log_2 (d_{vc}K))\n",
    "$$\n",
    "接着验证下推论\n",
    "$$\n",
    "d_{vc}(H) = O(max(d_{vc}, K) log_2 max(d_{vc}, K))\n",
    "$$\n",
    "由之前的结论我们可得\n",
    "$$\n",
    "d_{vc}\\le7(d_{vc} + K) log_2 (d_{vc}K)\\le 7max(d_{vc}, K)\\times2log_2(max(d_{vc}, K)^2)=28max(d_{vc}, K) log_2 max(d_{vc}, K)\n",
    "$$\n",
    "所以推论成立。\n",
    "\n",
    "总结下，这题是对并集的VC dimension证明一些不等式，进行放缩，技巧性比较强，但是放缩的过程中发现$7(d_{vc} + K) log_2 (d_{vc}K)$其实是一个很宽松的上界，完全可以取一个更小的下界，不过这里最终的结论应该是要得出$d_{vc}(H) = O(max(d_{vc}, K) log_2 max(d_{vc}, K))$，因此更小的下界其实也不一定有必要了。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.15 (Page 71)\n",
    "\n",
    "The monotonically increasing hypothesis set is \n",
    "$$\n",
    "\\mathcal{H}=\\{h|x_1\\ge x_2 \\Rightarrow h(x_1)\\ge h(x_2)\\}\n",
    "$$\n",
    "where $x_1\\ge x_2$ if and only if the inequality is satisfied for every component. \n",
    "\n",
    "(a) Give an example of a monotonic classifier in two dimensions, clearly showing the +1 and -1 regions. \n",
    "\n",
    "(b) Compute $m_{\\mathcal{H}}(N)$ and hence the VC dimension. {Hint: Consider a set of N points generated by first choosing one point, and then generating the next point by increasing the first component and decreasing the second component until N points are obtained.}    \n",
    "\n",
    "(a)对二维空间中的点$x=(x_1,x_2)$，定义$h(x)=x_1+x_2$,显然$h(x)$是递增函数，对应的边界是二维平面中的一条直线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1f51403c898>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "x=range(-10,10)\n",
    "y=[-i for i in x]\n",
    "up=[10]*len(x)\n",
    "\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.plot(x,y)\n",
    "\n",
    "plt.fill_between(x,y,up)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "蓝色区域的点标记为$+1$,白色区域的点标记为$-1$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(b)这题没有说维度，我们先考虑一维的情形，假设有$N$个点\n",
    "$$\n",
    "x_1\\le x_2 \\le...\\le x_N\n",
    "$$\n",
    "由单调函数的定义我们知道，如果$h(x_k)<0,h(x_{k+1})>0$，那么\n",
    "$$\n",
    "h(x_i)<0(i=1,2...k)\\\\\n",
    "h(x_i)>0(i=k+1,...N)\n",
    "$$\n",
    "因此对于一维的情形，相当于一刀切，左边为$-1$，右边为$+1$，因此一共有$m_{\\mathcal{H}}(N)=N+1$\n",
    "\n",
    "但是对于二维及以上情形就完全不一样了，我们如提示中这样构造点，先随意取一个点$x_1$，接着取第二个点$x_2$，使得$x_2$的第一个分量比$x_1$的第一个分量大，但是第二个分量比$x_1$的第二个分量小，换句话说，我们不让$x_2$大于$x1$，也不让$x_2$小于$x_1$，用同样的方式可以构造$x_3...x_N$，使得这$N$的点任意两个点是无序的，对于这样$N$个点，我们可以shatter 他们，因为此时$h(x_i)$和$h(x_j)$的关系没有限制。所以对于二维及以上情形$m_H(N)=2^N$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.16 (Page 72)\n",
    "\n",
    "In this problem , we will consider $\\mathcal{X} = \\mathcal{R} $.That is, x=$x$ is a one dimensional variable. For a hypothesis set prove that the VC dimension of $\\mathcal{H}$ is exactly $(D + 1)$ by showing that \n",
    "$$\n",
    "\\mathcal{H}=\\{h_c|h_c(x)=sign(\\sum_{i=0}^Dc_ix^i)\\}\n",
    "$$\n",
    "(a) There are $(D + 1)$ points which are shattered by $\\mathcal{H}$. \n",
    "\n",
    "(b) There are no $(D + 2)$ points which are shattered by $\\mathcal{H}$.    \n",
    "\n",
    "这题和Exercise 2.4基本一样，所以做法也差不多。\n",
    "\n",
    "(a)记$y_j=\\sum_{i=0}^Dc_ix_j^i$，现在取$D+1$个点，$x_1,x_2...x_{D+1},x_j=j$\n",
    "\n",
    "那么\n",
    "$$\n",
    "\\left(\\begin{matrix}\n",
    "y_1\\\\\n",
    "y_2\\\\\n",
    "...\\\\\n",
    "y_{D+1}\n",
    "\\end{matrix}\n",
    "\\right)\n",
    "=\n",
    "\\left(\n",
    "\\begin{matrix}\n",
    "\\sum_{i=0}^Dc_ix_1^i\\\\\n",
    "\\sum_{i=0}^Dc_ix_2^i\\\\\n",
    "...\\\\\n",
    "\\sum_{i=0}^Dc_ix_{D+1}^i\n",
    "\\end{matrix}\n",
    "\\right)\n",
    "=\n",
    "\\left(\n",
    "\\begin{matrix}\n",
    "1&1&1&...&1\\\\\n",
    "1&2&2^2&...&2^{D}\\\\\n",
    "1&3&3^2&...&3^{D}\\\\\n",
    "...&...&...&...&...&\\\\\n",
    "1&(D+1)&(D+1)^2&...&(D+1)^D\n",
    "\\end{matrix}\n",
    "\\right)\n",
    "\\times\n",
    "\\left(\n",
    "\\begin{matrix}\n",
    "c_0\\\\\n",
    "c_1\\\\\n",
    "...\\\\\n",
    "c_D\n",
    "\\end{matrix}\n",
    "\\right)\\\\\n",
    "$$\n",
    "我们知道\n",
    "$$\n",
    "\\left(\n",
    "\\begin{matrix}\n",
    "1&1&1&...&1\\\\\n",
    "1&2&2^2&...&2^{D}\\\\\n",
    "1&3&3^2&...&3^{D}\\\\\n",
    "...&...&...&...&...&\\\\\n",
    "1&(D+1)&(D+1)^2&...&(D+1)^D\n",
    "\\end{matrix}\n",
    "\\right)对应的行列式为范德蒙行列式，不为0\n",
    "$$\n",
    "那么对任意的$y=(y_1,y_2,...,y_{D+1})^T$\n",
    "$$\n",
    "\\left(\n",
    "\\begin{matrix}\n",
    "1&1&1&...&1\\\\\n",
    "1&2&2^2&...&2^{D}\\\\\n",
    "1&3&3^2&...&3^{D}\\\\\n",
    "...&...&...&...&...&\\\\\n",
    "1&(D+1)&(D+1)^2&...&(D+1)^D\n",
    "\\end{matrix}\n",
    "\\right)\n",
    "\\times\n",
    "\\left(\n",
    "\\begin{matrix}\n",
    "c_0\\\\\n",
    "c_1\\\\\n",
    "...\\\\\n",
    "c_D\n",
    "\\end{matrix}\n",
    "\\right)\n",
    "=\n",
    "\\left(\\begin{matrix}\n",
    "y_1\\\\\n",
    "y_2\\\\\n",
    "...\\\\\n",
    "y_{D+1}\n",
    "\\end{matrix}\n",
    "\\right)\n",
    "$$\n",
    "关于$c=(c_0,c_1,...c_D)^T$有解，因此存在$D+1$个点可以被shatter\n",
    "\n",
    "(b)记$z_j=(1,x_j,x_j^2...x_j^{D})\\in R^{D+1}$，那么现在任取$D+2$个点$x_1,x_2...x_{D+2}$，对应可以得到$z_1,z_2...z_{D+2}$。$R^{D+1}$空间任意$D+2$个点必然线性相关，所以不妨设$z_{D+2}$可以被线性表出，注意$c=(c_0,c_1,...c_D)^T$\n",
    "$$\n",
    "z_{D+2}=\\sum_{i=1}^{D+1}k_iz_i\\\\\n",
    "c^Tz_{D+2}=\\sum_{i=1}^{D+1}c^Tk_iz_i\\\\\n",
    "sign(c^Tz_{D+2})=sign(\\sum_{i=1}^{D+1}k_ic^Tz_i)\n",
    "$$\n",
    "也就是说$z_{D+2}$的分类被$z_1,z_2...z_{D+1}$确定，那么\n",
    "$(sign(z_1),sign(z_2)...sign(z_{D+1}),-sign(z_{D+2}))$这种情形必然无法被划分出来，因此$d_{vc}\\le D+1$\n",
    "\n",
    "结合(a),(b)我们可得\n",
    "$$\n",
    "d_{vc}=D+1\n",
    "$$\n",
    "回顾书上的说明，$d_{vc}$可以理解为自由分量的个数，对于$D$次多项式，显然有$D+1$个自由分量。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#### Problem 2.17 (Page 72) \n",
    "\n",
    "The VC dimension depends on the input space as well as $\\mathcal{H}$. For a fixed $\\mathcal{H}$, consider two input spaces $\\mathcal{X_1} \\subseteq \\mathcal{X_2} $. Show that the VC dimension of $\\mathcal{H}$ with respect to input space $\\mathcal{X_1}$ is at most the VC dimension of $\\mathcal{H}$ with respect to input space $\\mathcal{X_2}$. \n",
    "\n",
    "How can the result of this problem be used to answer part (b) in Problem 2.16? [Hint: How is Problem 2.16 related to a perceptron in D dimensions?}    \n",
    "\n",
    "反正法，假设$d_1=d_{vc}(\\mathcal{X1},\\mathcal{H})> d_{vc}(\\mathcal{X2},\\mathcal{H})=d_2$。那么在$\\mathcal{X_1}$中必然有$d_1$个点可以被shatter，由$\\mathcal{X_1} \\subseteq \\mathcal{X_2} $我们知道这$d_1$个点也在$\\mathcal{X_2}$中，因为假设空间均为$\\mathcal{H}$，我们知道$\\mathcal{X_2}$中这$d_1$个点也可以被shatter，这就与$d_1=d_{vc}(\\mathcal{X1},\\mathcal{H})> d_{vc}(\\mathcal{X2},\\mathcal{H})=d_2$矛盾。因此$d_{vc}(\\mathcal{X1},\\mathcal{H})\\le d_{vc}(\\mathcal{X2},\\mathcal{H})$\n",
    "\n",
    "回到上题的(b)部分，我们知道$z_j=(1,x_j,x_j^2...x_j^{D})\\in R^{D+1}$，所以整个输入空间的集合构成了整个$R^{D+1}$的子集，而我们知道维度为$D+1$的感知机的VC dimension 为D+1，因此$d_{vc}\\le D+1$。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#### Problem 2.18 (Page 72)\n",
    "\n",
    "The VC dimension of the perceptron hypothesis set corresponds to the number of parameters $(w_0, w_1 , ..., w_d)$ of the set, and this observation is ' usually' true for other hypothesis sets. However, we will present a counter example here. Prove that the following hypothesis set for $x\\in R$ has an infinite VC dimension : \n",
    "$$\n",
    "\\mathcal{H}=\\{h_{\\alpha}|h_{\\alpha}=(-1)^{\\lfloor \\alpha x \\rfloor},where\\  {\\alpha}\\in R,\n",
    "$$\n",
    " where $\\lfloor A\\rfloor$is the biggest integer $ \\le A$ (the floor function). This hypothesis has only one parameter $\\alpha$ but 'enjoys' an infinite VC dimension. [Hint: Consider $x_1 , . . . , x_N$, where $x_n =10^n$ , and show how to implement an arbitrary dichotomy $y_1, . . . , y_N$ .]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由感知机模型的例子我们似乎可以得出VC dimension和变量的自由分量有关，这题就给出一个反例，只有一个参数，但是VC dimension是无穷大。\n",
    "\n",
    "首先对$N$维说明这个事情，任取$(y_1,...,y_N)\\in \\{-1,+1\\}^N$，我们构造这样一个$z=(z_1,...,z_N)$，使得\n",
    "$$\n",
    "当y_i=+1时，z_i=0\n",
    "\\\\ 当y_i=-1时，z_i=1\n",
    "\\\\简单来说，就是(-1)^{z_i}=y_i\n",
    "$$\n",
    "现在取\n",
    "$$\n",
    "\\alpha=0.z_1z_2...z_N\\\\\n",
    "x=(x_1 , . . . , x_N), x_n =10^n\n",
    "$$\n",
    "那么\n",
    "$$\n",
    "\\begin{aligned}\n",
    "h_{\\alpha}(x_i)&=(-1)^{\\lfloor \\alpha x_i \\rfloor}\n",
    "\\\\&=(-1)^{\\lfloor{0.z_1z_2...z_N\\times10^n}\\rfloor}\n",
    "\\\\&=(-1)^{z_1z_2...z_n}\n",
    "\\\\&=(-1)^{z_n}\n",
    "\\\\&=y_n(回顾之前的结论)\n",
    "\\end{aligned}\n",
    "$$\n",
    "所以任意$x=(x_1 , . . . , x_N)$均可以被shatter。从上面的结论我们推出\n",
    "$$\n",
    "对任意x=(x_1,...x_N,...)\\in R^{\\infty}，y=(y_1,...,y_N,...)\\in \\{-1,+1\\}^{\\infty}\\\\\n",
    "存在z=(z_1,...,z_N,...)\\in \\{0,1\\}^{\\infty}.其中(-1)^{z_i}=y_i\n",
    "$$\n",
    "因此$\\mathcal{H}$的VC dimension为无穷大。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.19 (Page 72)\n",
    "\n",
    "This problem derives a bound for the VC dimension of a complex hypothesis set that is built from simpler hypothesis sets via composition. Let $\\mathcal{H_1},...,\\mathcal{H_k}$ be hypothesis sets with VC dimension $d_1, . . . , d_K$ . Fix $h_1 , . . . , h_k$ , where $h_i \\in \\mathcal{H_i} $. Define a vector $z$ obtained from $x$ to have components $h_i (x) $. Note that $x \\in R^d$, but z $z\\in \\{-1, +1\\}^K$ . Let $\\tilde{  \\mathcal H}$ be a hypothesis set of functions that take inputs in $R^K$ . So \n",
    "$$\n",
    "\\tilde{h}\\in\\tilde{\\mathcal{H}}:z\\in R^K \\mapsto \\{+1,-1\\}\n",
    "$$\n",
    "and suppose that $\\tilde{\\mathcal{H}}​$ has VC dimension $\\tilde{d} ​$.    \n",
    "We can apply a hypothesis in $\\tilde{\\mathcal{H}}$ to the $z$ constructed from $(h_1 , . . . , h_K)$ . This is the composition of the hypothesis set $\\tilde{\\mathcal{H}}$ with $(\\mathcal{H_1},...,\\mathcal{H_k})$ . More formally, the composed hypothesis set $H=\\tilde{\\mathcal{H}}\\circ (\\mathcal{H_1},...,\\mathcal{H_k})$ is defined by $h\\in \\mathcal{H}$ if \n",
    "$$\n",
    "h(x) = \\tilde{h}(h_1(x) , . . . , h_K (x) ) ,\\tilde{h}\\in\\tilde{\\mathcal{H}};h_i\\in\\mathcal{H_i}\n",
    "$$\n",
    "(a) Show that\n",
    "$$\n",
    "m_H(N)\\le m_\\tilde{H}(N) \\prod _{i=1}^{K}m_{\\mathcal{H_i}} (N) .\t (2. 18)\n",
    "$$\n",
    "[Hint: Fix $N​$ points $x_1 , . . . , x_N​$ and fix $h_1, . . . , h_K​$ . This generates N transformed points $z_1 , . . . , z_N​$ . These $z_1, . . . , z_N​$ can be dichotomized in at most $m_\\tilde{\\mathcal{h}}(N)​$ ways, hence for fixed $(h_1 , . . . , h_k), (x_1 , . . . , x_N)​$ can be dichotomized in at most $m_\\tilde{\\mathcal{H}}(N)​$ ways. Through the eyes of $x_1 , . . . , x_N​$, at most how many hypotheses are there (eﬀectively) in $\\mathcal{H_i}​$? Use this bound to bound the effective number of K-tuples $(h_1, . . . , h_K)​$ that need to be considered. Finally, argue that you can bound the number of dichotomies that can be implemented by the product of the number of possible K-tuples $(h_1, . . . , h_K)​$ and the number of dichotomies per K-tuple.]\n",
    "\n",
    "(b) Use the bound $m(N)\\le(\\frac{eN}{d_{vc}})^{d_{vc}}$ to get a bound for $m_H(N) $in terms of $\\tilde{d}, d_1, . . . , d_K$ . \n",
    "\n",
    "(c) Let $D = \\tilde{d}+ \\sum _{i=1}^{K}d_i $, and assume that $D > 2e log_2 D$. Show that \n",
    "$$\n",
    "d_{vc}(\\mathcal{H})\\le 2Dlog_2D.\n",
    "$$\n",
    "(d) If $\\mathcal{H_i}​$ and $\\tilde{H}​$ are all perceptron hypothesis sets, show that \n",
    "$$\n",
    "d_{vc} (\\mathcal{H}) = O(dK log(dK)).\n",
    "$$\n",
    "In the next chapter, we will further develop the simple linear model. This linear model is the building block of many other models, such as neural networks. The results of this problem show how to bound the VC dimension of the more complex models built in this manner.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这题希望解释的是复合函数的VC dimension以及$m_{\\mathcal{H}}(N)$，下面分别看一下\n",
    "\n",
    "(a)我们根据提示里一步步来。\n",
    "\n",
    "首先对于固定的$N$个点 $x_1 , . . . , x_N$和固定的 $h_1, . . . , h_K$，我们可以得到$N$个转换后的点$z_1 , . . . , z_N$，那么对于这$N$个点和假设$\\tilde{\\mathcal{H}}$，最多可以可以表示$m_\\tilde{H}(N)$种组合。因此对于固定的$(x_1 , . . . , x_N)$和$(h_1, . . . , h_K)$最多可以表示$m_\\tilde{H}(N)$种组合，所以接下来只要看$(h_1, . . . , h_K)$可以表示出多少种有效的组合，这部分可以用数学公式写下来：\n",
    "$$\n",
    "m_H(N)\\le m_\\tilde{h}(N)((h_1, . . . , h_K)最多可以表示的组合数量)\n",
    "$$\n",
    "我们还是用之前类似的思路考虑，对于固定的$h_2,h_3,...,h_K$，$(h_1(x_1),h_1(x_2),...,h_1(x_N))$最多可以表示出$m_{\\mathcal{H_1}}(N)$种组合，同理对于任意$h_i$，固定其他的$h_j(i\\neq j)$，最多可以表示出$m_{\\mathcal{\\mathcal{H}_i}}$种组合，因此由乘法原理可得：\n",
    "$$\n",
    "m_H(N)\\le m_\\tilde{H}(N) \\prod _{i=1}^{K}m_{\\mathcal{H_i}} (N)\n",
    "$$\n",
    "(b)这个就比较简单了，题目中的不等式可以查看Problem 2.6。由$m(N)\\le(\\frac{eN}{d_{vc}})^{d_{vc}}$，我们可得:\n",
    "$$\n",
    "\\begin{aligned}\n",
    "m_H(N)&\\le m_\\tilde{H}(N) \\prod _{i=1}^{K}m_{\\mathcal{H_i}} (N) \n",
    "\\\\&\\le (\\frac{eN}{\\tilde d})^{\\tilde d} \\prod _{i=1}^{K}(\\frac{eN}{d_i})^{d_i}\n",
    "\\\\&= \\frac{(eN)^{\\tilde d+\\sum_{i=1}^Kd_i}}{{\\tilde d}^{\\tilde d}\\prod_{i=1}^Kd_i^{d_i}}\n",
    "\\end{aligned}\n",
    "$$\n",
    "(c)只要证明\n",
    "$$\n",
    "当N=2Dlog_2D时，m(N)<2^N即可\n",
    "$$\n",
    "由上题我们知道\n",
    "$$\n",
    "m_H(N)\\le  \\frac{(eN)^{\\tilde d+\\sum_{i=1}^Kd_i}}{{\\tilde d}^{\\tilde d}\\prod_{i=1}^Kd_i^{d_i}}=\\frac{(eN)^D}{{\\tilde d}^{\\tilde d}\\prod_{i=1}^Kd_i^{d_i}}=\\frac{(eN)^D}{e^{\\tilde d ln(\\tilde d)+\\sum_{i=1}^Kd_iln(d_i)}}\n",
    "$$\n",
    "下面对分母${e^{\\tilde d ln(\\tilde d)+\\sum_{i=1}^Kd_iln(d_i)}}$进行估计，首先介绍**琴生不等式（Jensen's inequality）**\n",
    "$$\n",
    "若f(x)是下凸函数(f^{''}(x)\\ge0),那么对于任意\\lambda_1+\\lambda_2+...+\\lambda_n=1(\\lambda_i\\ge0)有\n",
    "\\\\\\sum_{i=1}^n \\lambda_if(x_i)\\ge f(\\sum_{i=1}^n\\lambda_i x_i)\n",
    "\\\\特别的，取\\lambda_i=\\frac 1 n时可得\n",
    "\\\\ \\frac{\\sum_{i=1}^nf(x_i)}{n}\\ge f(\\frac {\\sum_{i=1}^n x_i}n)\n",
    "$$\n",
    "回到原题，我们令$f(x)=xlnx$，那么\n",
    "$$\n",
    "\\begin{aligned}\n",
    "f^{'}(x)=lnx+1\\\\\n",
    "f^{''}(x)=\\frac 1 x>0\n",
    "\\end{aligned}\n",
    "$$\n",
    "因此$f(x)$是下凸函数，现在令$\\tilde d=d_{K+1}$，通过变形以及琴生不等式可得\n",
    "$$\n",
    "\\begin{aligned}\n",
    "{e^{\\tilde d ln(\\tilde d)+\\sum_{i=1}^Kd_iln(d_i)}}&=e^{\\sum _{i=1}^{K+1}d_iln(d_i)}\n",
    "\\\\&=e^{\\sum _{i=1}^{K+1}f(d_i)}\n",
    "\\\\&\\ge e^{(K+1)f(\\frac {\\sum_{i=1}^{K+1}d_i}{K+1})}(这一步是由琴生不等式)\n",
    "\\\\&=e^{(K+1)f(\\frac {D}{K+1})}(注意D = \\tilde{d}+ \\sum _{i=1}^{K}d_i = \\sum _{i=1}^{K+1}d_i)\n",
    "\\\\&=e^{(K+1)\\times \\frac {D}{K+1}ln(\\frac {D}{K+1})}\n",
    "\\\\&=e^{Dln(\\frac {D}{K+1})}\n",
    "\\\\&=(\\frac {D}{K+1})^D\n",
    "\\end{aligned}\n",
    "$$\n",
    "因此\n",
    "$$\n",
    "m_H(N)\\le \\frac{(eN)^D}{e^{\\tilde d ln(\\tilde d)+\\sum_{i=1}^Kd_iln(d_i)}}\\le\\frac{(eN)^D}{(\\frac {D}{K+1})^D}\n",
    "$$\n",
    "现在取$N=2Dlog_2D$，那么上述不等式右边可以化为\n",
    "$$\n",
    "\\frac{(eN)^D}{(\\frac {D}{K+1})^D}=\\frac{(e2Dlog_2D)^D}{(\\frac {D}{K+1})^D}={(2elog_2D)^D}{(K+1)^D}(这一步是约去分子分母的D^D)\n",
    "$$\n",
    "回顾题目中的假设$D > 2e log_2 D$，以及一个比较显然但是容易忽略的结论\n",
    "$$\n",
    "D = \\tilde{d}+ \\sum _{i=1}^{K}d_i\\ge K+1\n",
    "$$\n",
    "注意$N=2Dlog_2D$，那么带入上式可得\n",
    "$$\n",
    "m_H(2Dlog_2D)=m_H(N)\\le\\frac{(eN)^D}{(\\frac {D}{K+1})^D}<D^DD^D=D^{2D}=2^{2Dlog_2D}\n",
    "$$\n",
    "因此当$N=2Dlog_2D$时，$m_H(N)<2^N$，所以\n",
    "$$\n",
    "d_{vc}(\\mathcal{H})\\le 2Dlog_2D.\n",
    "$$\n",
    "这题总体来说还是有一定难度的，比较难的一点是琴生不等式如果使用的少那么那步不等式放缩可能会做不出来。\n",
    "\n",
    "(d)结合(c)来考虑这题，对于$R^n$中的感知机模型，我们知道它的VC dimension为$n+1$，这题中$(\\mathcal{H_1},...,\\mathcal{H_k})$为$R^d$中的感知机，$\\tilde{\\mathcal{H}}$为$R^K$中的感知机，因此\n",
    "$$\n",
    "\\begin{aligned}\n",
    "D& = \\tilde{d}+ \\sum _{i=1}^{K}di \n",
    "\\\\&=K+1+ \\sum _{i=1}^{K}(d+1)\n",
    "\\\\&=Kd+K+K+1\n",
    "\\\\&=Kd+2K+1\n",
    "\\end{aligned}\n",
    "$$\n",
    "带入(c)中可得\n",
    "$$\n",
    "d_{vc}(\\mathcal{H})\\le 2Dlog_2D=2(Kd+2K+1)log_2(Kd+2K+1)\n",
    "$$\n",
    "因此$d_{vc}= O(dK log(dK))$\n",
    "\n",
    "可能有人会说(c)需要$D > 2e log_2 D$，这个不等式左边是一次式，右边是对数式，所以只有$D$取个稍微大点的数，例如32，这个不等式就必然成立。由$D = \\tilde{d}+ \\sum _{i=1}^{K}d_i $可得$D\\ge K+1$，所主要$K$稍大一些变能满足不等式了。\n",
    "\n",
    "总结一下，我认为这题的非常好，这个对于复合函数的VC dimension估计实际上非常好的解释了有些特征转换后的模型为什么可以shatter维度非常高的数据，从数学角度证明了看起来显然的事情。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.20 (Page 73)\n",
    "\n",
    "There are a number of bounds on the generalization error $\\epsilon$ ,all holding with probability at least $1 - \\delta$. \n",
    "\n",
    "(a) Original VC-bound: \n",
    "$$\n",
    "\\epsilon\\le \\sqrt{\\frac 8 Nln{\\frac {4m_H(2N)}\\delta}}\n",
    "$$\n",
    "(b) Rademacher Penalty Bound:    \n",
    "$$\n",
    "\\epsilon\\le \\sqrt{{\\frac {2ln(2Nm_H(N))}N}}+\\sqrt {\\frac 2Nln{\\frac 1 \\delta}}+\\frac 1N\n",
    "$$\n",
    "(c) Parrondo and Van den Broek: \n",
    "$$\n",
    "\\epsilon\\le \\sqrt{{\\frac 1N}(2\\epsilon+ln{\\frac {6m_H(2N)}\\delta})}\n",
    "$$\n",
    "(d) Devroye: \n",
    "$$\n",
    "\\epsilon\\le \\sqrt{{\\frac 1{2N}}(4\\epsilon(1+\\epsilon)+ln{\\frac {4m_H(N^2)}\\delta})}\n",
    "$$\n",
    "​Note that (c) and (d) are implicit bounds in $\\epsilon$. Fix $d_{vc} = 50$ and $ \\delta = 0.05$ and plot these bounds as a function of N. Which is best? "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这题就是按照公式估计上界并作图，注意${m}_\\mathcal{H }(N) \\le \\sum_{i=0}^{d_{vc}}\\binom{N}{i} $\n",
    "\n",
    "但(c),(d)左右两边都有$\\epsilon$，应该要处理一下。\n",
    "\n",
    "先看(c)，令$a=\\frac 1 N,b=ln{\\frac {6m_H(2N)}\\delta}$，那么不等式可以化为\n",
    "$$\n",
    "\\epsilon\\le \\sqrt{2a\\epsilon+ab}\n",
    "\\\\两边平方可得\n",
    "\\\\\\epsilon^2\\le2a\\epsilon+ab\n",
    "\\\\(\\epsilon-a)^2\\le ab+a^2\n",
    "\\\\ -\\sqrt{ab+a^2}\\le \\epsilon-a\\le\\sqrt{ab+a^2}\n",
    "\\\\a-\\sqrt{ab+a^2}\\le \\epsilon\\le a+\\sqrt{ab+a^2}\n",
    "\\\\这里只要考虑上界\n",
    "\\\\\\epsilon\\le a+\\sqrt{ab+a^2}\n",
    "\\\\将a=\\frac 1 N,b=ln{\\frac {6m_H(2N)}\\delta}带入可得\n",
    "\\\\\\epsilon\\le \\frac1N+\\sqrt{\\frac{1}{N^2}+\\frac{1}{N}ln{\\frac {6m_H(2N)}\\delta}}\n",
    "$$\n",
    "对于(d)，令$a=\\frac 1 {2N},b=ln{\\frac {4m_H(N^2)}\\delta}$，那么不等式可以化为\n",
    "$$\n",
    "\\epsilon\\le \\sqrt{a(4\\epsilon(1+\\epsilon)+b)}\n",
    "\\\\两边平方可得\n",
    "\\\\\\epsilon^2\\le4a\\epsilon(1+\\epsilon)+ab\n",
    "\\\\(1-4a)\\epsilon^2-4a\\epsilon\\le ab\n",
    "\\\\注意这里我们只要考虑N很大的情形，所以1-4a=1-\\frac 2N>0\n",
    "\\\\(1-4a)(\\epsilon-\\frac {2a}{1-4a})^2\\le ab+\\frac{4a^2}{1-4a}\n",
    "\\\\(\\epsilon-\\frac {2a}{1-4a})^2\\le\\frac{ab+\\frac{4a^2}{1-4a}}{1-4a}\n",
    "\\\\ -\\sqrt{\\frac{ab+\\frac{4a^2}{1-4a}}{1-4a}}\\le\\epsilon-\\frac {2a}{1-4a}\\le\\sqrt{\\frac{ab+\\frac{4a^2}{1-4a}}{1-4a}}\n",
    "\\\\这里只要考虑上界，因此\n",
    "\\\\ \\epsilon\\le \\sqrt{\\frac{ab+\\frac{4a^2}{1-4a}}{1-4a}}+\\frac {2a}{1-4a}\n",
    "=\\sqrt{\\frac{ab}{1-4a}+\\frac{4a^2}{(1-4a)^2}}+\\frac {2a}{1-4a}\n",
    "\\\\将a=\\frac 1 {2N},b=ln{\\frac {4m_H(N^2)}\\delta}带入可得\n",
    "\\\\ \\epsilon\\le \\sqrt{\\frac{ln{\\frac {4m_H(N^2)}\\delta}}{2(N-2)}+\\frac{1}{(N-2)^2}}+\\frac{1}{N-2}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from scipy.special import comb\n",
    "from math import log\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "\n",
    "dvc=50\n",
    "delta=0.05\n",
    "\n",
    "#计算m(N)\n",
    "def m(n):\n",
    "    k=min(dvc,n)\n",
    "    s=0\n",
    "    for i in range(k+1):\n",
    "        s+=comb(n,k)\n",
    "    return s\n",
    "\n",
    "#Original VC-bound\n",
    "def f1(n):\n",
    "    result=(8/n)*log(4*m(2*n)/delta)\n",
    "    result=result**0.5\n",
    "    return result\n",
    "\n",
    "#Rademacher Penalty Bound\n",
    "def f2(n):\n",
    "    k1=(2*log(2*n*m(n))/n)\n",
    "    k2=(2/n)*log(1/delta)\n",
    "    k3=1/n\n",
    "    result=k1**0.5+k2**0.5+k3\n",
    "    return result\n",
    "\n",
    "#Parrondo and Van den Broek\n",
    "def f3(n):\n",
    "    k1=1/n\n",
    "    k2=1/(n**2)+(1/n)*log(6*m(2*n)/delta)\n",
    "    k2=k2**0.5\n",
    "    result=k1+k2\n",
    "    return result\n",
    "\n",
    "#Devroye\n",
    "def f4(n):\n",
    "    k1=1/((n-2)**2)\n",
    "    k2=log(4*m(n**2)/delta)/(2*(n-2))+1/(n-2)\n",
    "    k2=k2**0.5\n",
    "    result=k1+k2\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#产生点集\n",
    "import numpy as np\n",
    "x=np.arange(1000,10001,1000)\n",
    "\n",
    "y1=[f1(i) for i in x]\n",
    "y2=[f2(i) for i in x]\n",
    "y3=[f3(i) for i in x]\n",
    "y4=[f4(i) for i in x]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD6CAYAAAC1W2xyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xd8FHX+x/HXN8km2fSQhJBCCCUQ\nOkgvYgARLHgnguDpAXZPRL3fWfAUBQ8VbHcn3OmhCF7Dcp4Cp4AFAiGAFAWk1yCkQXpPNpvv74/d\nLElIWSBkk83n+XjsYzezszOfHfE93/3OzHeU1hohhBDOw8XRBQghhGhcEuxCCOFkJNiFEMLJSLAL\nIYSTkWAXQggnI8EuhBBORoJdCCGcjAS7EEI4GQl2IYRwMm6OWGlwcLCOjo52xKqFEKLF2r17d4bW\nOqSh+RwS7NHR0ezatcsRqxZCiBZLKXXanvmkK0YIIZyMBLsQQjgZu4JdKRWqlEqwY75eSqlvrrws\nIYQQl6vBPnalVCDwIeDdwHwKeAswNE5pQjQNk8nE2bNnKSkpcXQpQgDg6elJZGQkBsPlxak9B0/N\nwFRgVQPz3QNsBMZfViVCOMjZs2fx9fUlOjoaS/tECMfRWpOZmcnZs2fp2LHjZS2jwa4YrXWe1jq3\nvnmUUkHA3cAbl1WFEA5UUlJCUFCQhLpoFpRSBAUFXdEvyMY6eLoQeFZrbaprBqXUg0qpXUqpXefP\nn2+k1QrROCTURXNypf8eGyvYrwMWKaXigX5KqQU1Z9BaL9VaD9RaDwwJafD8+lqdzS5i/poDmMwV\nV1atEEI4sUsOdqXUGKXUo1Wnaa27aq3jtNZxwB6t9fONVWBVB1PyWJ6YxIrEpKuxeCEcoqCggNtu\nu42RI0cyY8YMysvL653/iSeesGu59s5Xm7i4uHrfHzJkCMeOHQNg9erV3HPPPQDMnTuX4cOHc9tt\nt1FQUFDrZ+fNm0d8fPxl11afFStWsGLFiquy7JbE7mC3hjZa6w1a6yUNzXc1jOsRytjYtvzp26Ok\n5hZfrdUI0aQWL15MTEwMW7ZsobS0lE8++aTe+f/0pz/ZtVx757scEyZM4JtvLGc2f/fdd4wfP56t\nW7eSkJBAYmIiN9xwA0uXLr1q6xf1c8iQApdLKcW8W3ty/VubWPC/Q/zlrmscXZJwMvPXHOBgSl6j\nLrNHuB8vTuxZ5/vff/89999/PwAjR45k586d/OpXvyIuLo5Bgwaxb98+1q9fb5s/Li7O1uItLi5m\n0qRJZGVl0blzZ3r16sXvf//7i+abN28eJpOJhIQE8vLyWLduHT4+PkyePJnCwkK6dOnC8uXL7f5O\n48eP54033uCRRx5h48aNvPDCC7z99tvcdNNNKKUYP348Bw4cqPPzb731Fi+++CJhYWH861//wtXV\nldmzZ7Nnzx4CAgL4+9//zqpVlhPxZs6cSXx8PPHx8URHR7N371727t1LWloan3zyCd26deOOO+4g\nJycHg8HAr371K7u/h7NqcVeetm/jxaOju/DlT6lsOioHYUXLl5+fj7e35TIRLy8v8vIsO5bt27cz\nbNiwaqFe0+HDh4mMjGTLli0cP37cFuq1OX78OJs3b2bSpEls2LCB1NRUZs+ezbfffktSUhLp6el2\n1zxkyBD27NnD2bNn8fLyIigoiPT0dNq0aQNAp06dmDhxIg899BBxcXG2x0svvQTAwIED2bRpE/7+\n/qxZs4b//e9/lJSUkJCQwO23386iRYvqXPfOnTtZv349c+bMYfXq1fz3v/+lQ4cObNy4kQ4dOtj9\nHZxZi2qxV3rwuk7898dkXly1n3VPjMLT4OrokoSTqK9lfbX4+fnZ+qMLCwvx8/MDoFevXkyaNKne\nz0ZERLB7925GjRrF448/Xu+806dPByAqKoqysjIMBgPvv/8+y5cvJysri+Ji+7s3XV1dGTBgAIsW\nLeKGG2646Hvs2LGDTZs28be//e2iz86bN48hQ4YAcM0113DixAnMZrNt2tChQ/n888+JjY21faZq\nbXfeeScGg4GoqChOnjzJqVOn6Nu3L2DZYYgW2GIH8HBz5aVf9CQps4ilm086uhwhrsiQIUNsXSYJ\nCQkMHjwYAB8fnwY/u27dOubOncu2bdu466676p238ldBpWXLljF58mRWrlx50Xv2mDBhAu+++y4T\nJkwAYMSIEbZ+902bNmE0Guv87O7duwHYt28f0dHR9OzZk+3btwOWXyo9e/bE3d2dylOj165dW+f3\niIqKsnX7/Pjjj5f8PZxRiwx2gGtjQri5TxhLNh7ndGaho8sR4rI9+uijnDx5kuHDh2M0GpkyZYrd\nn+3fvz+zZ89mzJgxTJs2jf3799v92XHjxvHqq68yZswYAJKTky+p7vHjx+Pj42Nrad9666106tSJ\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1c0f3f5ac88>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x,y1,label=\"Original VC-bound\")\n",
    "plt.plot(x,y2,label=\"Rademacher Penalty Bound\")\n",
    "plt.plot(x,y3,label=\"Parrondo and Van den Broek\")\n",
    "plt.plot(x,y4,label=\"Devroye\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里发现Devroye有一部分图像没了，看下原因"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.52617484593182073,\n",
       " 0.39450898728341854,\n",
       " 0.33239411668265501,\n",
       " 0.29402105801720696,\n",
       " inf,\n",
       " inf,\n",
       " inf,\n",
       " inf,\n",
       " inf,\n",
       " inf]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$m_\\mathcal{H}(N)$溢出了，所以可能要计算$ln(m_\\mathcal{H}(N))$，但之前的式子其实不方便取对数，所以这里采取了Problem 2.6的结论\n",
    "$$\n",
    "m_\\mathcal{H}(N)\\le (\\frac {eN}{d_{vc}} )^{d_{vc}}\n",
    "\\\\ln(m_\\mathcal{H}(N))\\le d_{vc}(1+ln(N)-ln(d_{vc}))\n",
    "$$\n",
    "接着重新计算一下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from scipy.special import comb\n",
    "from math import log\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "\n",
    "dvc=50\n",
    "delta=0.05\n",
    "\n",
    "#计算m(N)\n",
    "def lnm(n):\n",
    "    s=dvc*(1+log(n)-log(dvc))\n",
    "    return s\n",
    "\n",
    "#Original VC-bound\n",
    "def f1(n):\n",
    "    result=(8/n)*(log(4/delta)+lnm(2*n))\n",
    "    result=result**0.5\n",
    "    return result\n",
    "\n",
    "#Rademacher Penalty Bound\n",
    "def f2(n):\n",
    "    k1=(2/n)*(log(2*n)+lnm(n))\n",
    "    k2=(2/n)*log(1/delta)\n",
    "    k3=1/n\n",
    "    result=k1**0.5+k2**0.5+k3\n",
    "    return result\n",
    "\n",
    "#Parrondo and Van den Broek\n",
    "def f3(n):\n",
    "    k1=1/n\n",
    "    k2=1/(n**2)+(1/n)*(log(6/delta)+lnm(2*n))\n",
    "    k2=k2**0.5\n",
    "    result=k1+k2\n",
    "    return result\n",
    "\n",
    "#Devroye\n",
    "def f4(n):\n",
    "    k1=1/((n-2)**2)\n",
    "    k2=(log(4/delta)+lnm(n**2))/(2*(n-2))+1/(n-2)\n",
    "    k2=k2**0.5\n",
    "    result=k1+k2\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#产生点集\n",
    "import numpy as np\n",
    "x=np.arange(1000,30001,1000)\n",
    "\n",
    "y1=[f1(i) for i in x]\n",
    "y2=[f2(i) for i in x]\n",
    "y3=[f3(i) for i in x]\n",
    "y4=[f4(i) for i in x]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nFgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1c0f56d0518>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x,y1,label=\"Original VC-bound\")\n",
    "plt.plot(x,y2,label=\"Rademacher Penalty Bound\")\n",
    "plt.plot(x,y3,label=\"Parrondo and Van den Broek\")\n",
    "plt.plot(x,y4,label=\"Devroye\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "看下两个比较接近的上界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAD6CAYAAABApefCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xl8VOW9+PHPN/u+TxYSwk4SdiSy\nuGCsIFiXKgWltkVsXWv9tffe3qpVe23r1tZfl1tbe3HB/rTFolYu1YLggqCCEmQnIDuE7PtG9uf3\nx5nsExggyUxmvu/X67xm8sxz5nxPkvmeM895zvOIMQallFKezcfVASillOp/muyVUsoLaLJXSikv\noMleKaW8gCZ7pZTyAprslVLKC2iyV0opL6DJXimlvIAme6WU8gJ+rg6gTVxcnBk+fLirw1BKqUFl\n27ZtJcYY29nquU2yHz58ONnZ2a4OQymlBhUROe5MPW3GUUopL6DJXimlvIAme6WU8gJu02avlDtp\namoiNzeX+vp6V4eiFABBQUGkpKTg7+9/XutrslfKgdzcXMLDwxk+fDgi4upwlJczxlBaWkpubi4j\nRow4r/fQZhylHKivryc2NlYTvXILIkJsbOwFfdPUZK9ULzTRK3dyof+Pgz/ZV5yADx6H8mOujkQp\npdzW4E/29VWw8deQqzdkKc/x2GOPkZGRwezZs7nqqqvIy8tzSQwbNmxw2TZmzJjBwYMHAVi9ejW3\n3377gGzXWUuXLmXq1KlkZWVxyy230NLSckHv9/LLL/Pyyy9f0HucyeBP9nFjQHyg+ICrI1GqTz38\n8MNs3LiR22+/nT/84Q+uDmfAzZ8/n/Xr1wPw/vvvM2/ePBdH1NMf/vAHNmzYQHR0NOvWrXN1OGc0\n+Hvj+AVCzEgo3u/qSJSH+tk/97Ivr6pP33PckAj+6/rxTtUtLy8nODiYmpoaFi5cSG1tLaNHj2b5\n8uUAZGVlcfHFF7Nr1y7effddh2UNDQ0sXbqUvLw8UlJSWL58OU8++SRNTU1s2rSJqqoq1q5dS2Bg\nIIsWLaKlpQVjDFlZWQ7XDQgI6BGno/gee+wxp7bhyLx583jmmWf43ve+x4cffshPf/pTp7eRmJjo\n8PfYfbt1dXUsWbKEoqIiJk6cyB//+Een36+zkpISQkNDnf7dNzc399hum7179/L973+f1atXEx4e\n7tT/iDMG/5k9gC1dk73yOE888QSzZ89my5Yt/OAHPyA/P5/777+f9957j2PHjlFYWAjAli1bmDVr\nVnuid1T2/PPPM2HCBD766CPGjBnDSy+9BMChQ4fYuHEjCxYs4IMPPmDZsmVcd911fPjhh+39uXtb\nt7ve4nNmG47MmDGDHTt2kJubS0hICLGxsU5vwxFH2122bBkTJkxg48aN5Ofns2vXLqffD+D+++8n\nPT2dvLw8Zs2a5fTvvrft5ufn881vfpMVK1b0aaIHTzizB7ClwYE10NwIfj3POJS6EM6egfe1hx9+\nmG9961vtP5eXl/PCCy+wfPlyysrKOH36NAATJkxgwYIFXdbtXrZv3772n2fOnMmaNWuIjo5myZIl\nAKSmptLY2MjRo0e55ZZbAMjMzOx1XUf8/f0dxufMNhzx9fVl2rRp/PKXv+Tqq68+p2044mi7Bw4c\n4NNPP2XDhg1UVFRw6tQpp98PrGacSy65hH/7t3/j6aef5tFHH3Xqd9/Y2Ohwu88++yxTp07l+PHj\nZ/02ca485Mw+A0wLlB12dSRK9ZsXX3yRhQsXsmLFivYmA4CwsLAedbuXjR8/ni1btgDWmef48dYB\nrPP7gJXc9u7dC8COHTvOuK6z8Tmzjd7Mnz+fP//5z8yfP/+ctuGIo+2mpaXxwx/+kA0bNvD444+T\nmprq9Pu18fHxITo6murqasC5331v23300Ud57rnnePTRR53evtNx9vk7uoItzXrUphzlwebOnctT\nTz3FV77yFYD2s0Fn3HHHHezdu5fZs2dz8OBBli5d6rDeXXfdxZtvvklWVhZVVVXntK6z8TnaRm/m\nzZtHWFgYM2bMOKdtOLvdO++8kzVr1jB79mz+/Oc/M3ToUKffD6xmnEsvvZT169dz3333Oazj6PfX\n23aDgoIYOnQo6enprF69+pxiORsxxvTpG56vzMxMc97j2TedhieS4IoH4MqH+jYw5ZVycnLIyMhw\ndRhKdeHo/1JEthljem8Ps/OMM3v/YIgermf2SinVC89I9gDxGdrXXimleuFUsheRF0Vks4g80svr\nfiJyQkQ22JeJ9vKfichWEfmjo/X6lC0NSg9BS1O/b0oppQabsyZ7EVkA+BpjZgEjRWSMg2qTgBXG\nmCz7sltEpgGXAdOBIhGZ06eRd2dLh9YmKDvSr5tRSqnByJkz+yxgpf35OqwE3t1M4DoR+dz+LcAP\nuAJ401hXgN8FLu+DeHunPXKUUqpXziT7UKCtf1MZkOCgzlZgjjFmOuAPfNWZ9UTkLhHJFpHs4uLi\nc429q7g0QLTdXnmEpUuXMmXKFDIzM3n++eddHY7yAM7cQVsDBNufh+H4ALHLGNNgf54NjHFmPWPM\nMmAZWF0vnQ/bgYAQiEqFopwLehul3MWzzz5LRkYGkydPZsaMGUyaNMnVIalBzJlkvw2r6WYLMBlw\ndOr8iog8AewBbgSeBBqBm4HX7Osd64N4z8yWrmf2qu+teRAKdvfteyZOhGuePmu12NhYrr32Wt56\n6y0eeOABKisruf7663nooYe48847ue+++5gyZQp33303d9xxBzabjYcffrh9oLK2YQVuu+02Kioq\nmDZtGr/73e+47bbbuPfee5k5cyZLly7lnnvuYcSIESxdurTLNpTncKYZZxXwbRH5DVby3isij3er\n83PgFWAHsNkY8x7wMTBVRH4PPAis6LuwO1TWNbF2Tz6lNQ32HjkHoaW5PzallEvExsbyi1/8gltu\nuYVPP/2UVatWUVpaysKFC9vHqdm/fz8XX3wxAP/85z+5++6720fFfPLJJ1m8eDGbNm2isrKStWvX\nsmTJEv7617/S2NhITk4OM2fO5KmnnuqxDeU5znpmb4ypEpEsYC7wK2NMAbCzW509WD1yOpe12nvg\nXAv83hhztM+i7uRoaS33vPoFf/7WNObHZ0BLozVrVdzo/tic8kZOnIH3p7KyMlpaWnjuued4+eWX\nqa2tJS8vj6uuuornnnuOnJycLgOKXX311cycObP953379nHPPfcA1kiSOTk5/OAHP+CBBx7gnXfe\n4YYbbgCsQcE2b97cZRuxsbEDu7Oq3zg16qUxppyOHjlOM8acBt441/XORVpCOCKQk1/F/HFtPXJy\nNNkrj1BRUcGaNWuYN28eDzzwAFdeeSWvvvoqMTEx+Pn5YbPZWLFiBQsXLmxfp7eBuEaPHs2WLVu4\n9dZb8fHxYe7cufzoRz9qH8I3LS2Nr33ta122oTzHoL+DNjjAlxGxoewvqIK4sVahdr9UHuD+++9n\n/vz5/PKXv+Tll1/mmWee4dJLL2Xt2rUkJFid22666SZee+21Lmfy3T300EO89tprXHbZZURFRbUP\nF7xo0SJSU1MZNmwYAA8++KDDbSjP4BEDod331y/YfaqSjT++En47AVJnwtdf6OMIlTfx9IHQ3n//\n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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1c0f57691d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x,y3,label=\"Parrondo and Van den Broek\")\n",
    "plt.plot(x,y4,label=\"Devroye\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在台大那门课里，老师希望我们使用$m_\\mathcal{H}(N)$的上界为$N^{d_{vc}}$，因此\n",
    "$$\n",
    "\\\\ln(m_\\mathcal{H}(N))\\le d_{vc}ln(N)\n",
    "$$\n",
    "我们来看下效果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from scipy.special import comb\n",
    "from math import log\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "\n",
    "dvc=50\n",
    "delta=0.05\n",
    "\n",
    "#计算m(N)\n",
    "def lnm(n):\n",
    "    s=dvc*log(n)\n",
    "    return s\n",
    "\n",
    "#Original VC-bound\n",
    "def f1(n):\n",
    "    result=(8/n)*(log(4/delta)+lnm(2*n))\n",
    "    result=result**0.5\n",
    "    return result\n",
    "\n",
    "#Rademacher Penalty Bound\n",
    "def f2(n):\n",
    "    k1=(2/n)*(log(2*n)+lnm(n))\n",
    "    k2=(2/n)*log(1/delta)\n",
    "    k3=1/n\n",
    "    result=k1**0.5+k2**0.5+k3\n",
    "    return result\n",
    "\n",
    "#Parrondo and Van den Broek\n",
    "def f3(n):\n",
    "    k1=1/n\n",
    "    k2=1/(n**2)+(1/n)*(log(6/delta)+lnm(2*n))\n",
    "    k2=k2**0.5\n",
    "    result=k1+k2\n",
    "    return result\n",
    "\n",
    "#Devroye\n",
    "def f4(n):\n",
    "    k1=1/((n-2)**2)\n",
    "    k2=(log(4/delta)+lnm(n**2))/(2*(n-2))+1/(n-2)\n",
    "    k2=k2**0.5\n",
    "    result=k1+k2\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#产生点集\n",
    "import numpy as np\n",
    "x=np.arange(1000,30001,1000)\n",
    "\n",
    "y1=[f1(i) for i in x]\n",
    "y2=[f2(i) for i in x]\n",
    "y3=[f3(i) for i in x]\n",
    "y4=[f4(i) for i in x]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n3e/aTOrTp0/n3HPPZeDAgYwfP77F9R293eZibs6yZcuYMmUKb7zxBk888QQA11xzDW+88QYFBQVY\nrdYWk7rP5yMnJ4fevXtzySWXYLfbue2223jwwQdZtWoVH3zwAZs3b25x20fHfPfdd/PCCy/wxhtv\nUFRU1Oq/S3tq81RXKZUMvAy0WkxCKXU1sENrvT5EsbWq/s6Yg+WM6JVyKjYpOoMgzqzbw1NPPcXn\nn3+OzWZDKYXZbOaBBx4gLi6uPonXFbsym82cdZZx/rR161bWrFnDokWLcLlc5Ofn07NnT0wmE716\n9cJkMqG1RmvN7bffTlpaWv2LPLZs2cLIkSMBWLBgATExxnnerFmzgIZiYVu3buW+++5DKYXP56vv\n8vj5z39O375929y3N998k+7du9d/bml9R2+3uZiDNX36dC666CKsVivXXHNNi+3qumLcbjfnnXce\neXl5bN68mVGjRqGUYsSIEWzZsqXJMo0Lkh0d8+7duznjjDOIiYmhf//+xxVzKAVzxu4DZgAtnhor\npVKAJ4AjSqnzQxRbq+prs0s/u4gSN9xwAy+88AI+n48nn3ySO++8k7/+9a/177+sK3bl8/n47juj\nu6h///489thj5ObmMn/+/PqyuUd78MEHef7553n88cfrL2AOGDCAutIekydPrn8j0tFFtvr378+i\nRYvIzc3l5ptvxmq1AsEVKWtOS+s7ervNxdwSh8NBVVVV/eeEhAR69OjB888/z+WXX95mTA6HA6fT\nSUVFBYMGDWLt2rVorfnqq68YOHBgfUEyl8tFXl5D58XRMffo0YNNmzbhcrnq/z3Doc0zdq11ObT5\nctVbgTeBvwCPKqXitdZLGjdQSs0F5oLxB3qy6muzS1eMiBLJyclMmDCBt956i4svvphf/vKXpKen\n43Q6OXDgALfffjvXXHMNTz75ZH0ynD9/Ptdddx133303vXv35sorr2x23VOnTuUnP/kJ3bt3x+v1\nUl1dzeOPP87111+P1+tl4sSJ9OvXr9llH3vsMa6//noqKysZO3bsCVWCPJH1NRez3W5vtu3MmTPr\n96WusuS0adOw2Ww4nc4WY6nriqmoqKB///5MmjSJgQMHct1119W/xGTAgAHMnDmTWbNmkZ2dzZAh\nQ1pc34MPPsisWbNIT09v8SB7KgRdBEwplau1zmnhu3eB32qttyilLgQmaa1/09K6TqYIWGMPv7eJ\n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\n7JFIJFJh/AGi2i16g5ramAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1c0f587eef0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x,y1,label=\"Original VC-bound\")\n",
    "plt.plot(x,y2,label=\"Rademacher Penalty Bound\")\n",
    "plt.plot(x,y3,label=\"Parrondo and Van den Broek\")\n",
    "plt.plot(x,y4,label=\"Devroye\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "看下这两个比较接近的两个上界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n5v8DMmqAreVYWK0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1c0f589fb70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x,y3,label=\"Parrondo and Van den Broek\")\n",
    "plt.plot(x,y4,label=\"Devroye\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "和之前的图稍有不同，这是因为上界取的不同的缘故所致。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.21 (Page 74)\n",
    "\n",
    "Assume the following theorem to hold \n",
    "\n",
    "Theorem\n",
    "$$\n",
    "P[\\frac{E_{out}(g)-E_{in}(g)}{\\sqrt {E_{out}(g)}}>\\epsilon]\\le c.m_{\\mathcal{H}}(2N)exp(-\\frac{{\\epsilon}^2N}4)\n",
    "$$\n",
    "where c is a constant that is a little bigger than 6. \n",
    "\n",
    "This bound is useful because sometimes what we care about is not the absolute generalization error but instead a relative generalization error (one can imagine that a generalization error of 0.01 is more significant when $E_{out} = 0.01$ than when $E_{out} = 0.5$). Convert this to a generalization bound by showing that with probability at least $1 - \\delta$, \n",
    "$$\n",
    "E_{out} (g ) \\le E_{in}( g) + \\frac{\\xi}2\\left [1+ \\sqrt{1+\\frac{4E_{in}(g)}{\\xi}}\\ \\right]\n",
    "$$\n",
    "where $\\xi=\\frac{4}{N}log{\\frac{c.m_{\\mathcal H}(2N)}{\\delta}}​$.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由题目中给出的不等式我们知道\n",
    "$$\n",
    "\\frac{E_{out}(g)-E_{in}(g)}{\\sqrt {E_{out}(g)}}\\le \\epsilon的概率大于等于1-c.m_{\\mathcal{H}}(2N)exp(-\\frac{{\\epsilon}^2N}4)\n",
    "$$\n",
    "现在要证明的结论中的概率为$1-\\delta​$，因此我们令$\\delta=c.m_{\\mathcal{H}}(2N)exp(-\\frac{{\\epsilon}^2N}4)​$\n",
    "\n",
    "，对此式化简可得\n",
    "$$\n",
    "ln\\frac{\\delta}{cm_{\\mathcal H}(2N)}=-\\frac{{\\epsilon}^2N}4\n",
    "\\\\-\\frac 4N ln\\frac{\\delta}{cm_{\\mathcal H}(2N)}={\\epsilon}^2\n",
    "\\\\我们令\\xi={\\epsilon}^2=\\frac 4Nln\\frac{cm_{\\mathcal H}(2N)}{\\delta}\n",
    "$$\n",
    "因此我们现在有\n",
    "$$\n",
    "\\frac{E_{out}(g)-E_{in}(g)}{\\sqrt {E_{out}(g)}}\\le \\epsilon的概率大于等于1-\\delta\n",
    "\\\\\\xi={\\epsilon}^2=\\frac 4Nln\\frac{cm_{\\mathcal H}(2N)}{\\delta}\n",
    "\\\\\\delta=c.m_{\\mathcal{H}}(2N)exp(-\\frac{{\\epsilon}^2N}4)\n",
    "$$\n",
    "为了更接近我们的结论，现在要对$\\frac{E_{out}(g)-E_{in}(g)}{\\sqrt {E_{out}(g)}}\\le \\epsilon$处理\n",
    "$$\n",
    "\\frac{E_{out}(g)-E_{in}(g)}{\\sqrt {E_{out}(g)}}\\le \\epsilon\n",
    "\\\\{E_{out}(g)-E_{in}(g)}\\le \\epsilon{\\sqrt {E_{out}(g)}}\n",
    "\\\\配方可得\n",
    "\\\\{E_{out}(g)- \\epsilon{\\sqrt {E_{out}(g)}}\\le E_{in}(g)}\n",
    "\\\\{E_{out}(g)- \\epsilon{\\sqrt {E_{out}(g)}}+\\frac{\\epsilon^2}{4}\\le E_{in}(g)}+\\frac{\\epsilon^2}{4}\n",
    "\\\\({\\sqrt {E_{out}(g)}}-\\frac{\\epsilon}2)^2\\le E_{in}(g)+\\frac{\\epsilon^2}{4}\n",
    "\\\\-\\sqrt{E_{in}(g)+\\frac{\\epsilon^2}{4}}\\le \\sqrt{E_{out}(g)}-\\frac{\\epsilon}2\\le\\sqrt{E_{in}(g)+\\frac{\\epsilon^2}{4}}\n",
    "\\\\  \\frac{\\epsilon}2-\\sqrt{E_{in}(g)+\\frac{\\epsilon^2}{4}}\\le  \\sqrt{E_{out}(g)}\\le \\frac{\\epsilon}2+\\sqrt{E_{in}(g)+\\frac{\\epsilon^2}{4}}\n",
    "\\\\注意到\\frac{\\epsilon}2-\\sqrt{E_{in}(g)+\\frac{\\epsilon^2}{4}}\\le0，所以这部分没什么意义，只需考虑右边的不等式\n",
    "\\\\ \\sqrt{E_{out}(g)}\\le \\frac{\\epsilon}2+\\sqrt{E_{in}(g)+\\frac{\\epsilon^2}{4}}\n",
    "\\\\两边平方可得\n",
    "\\\\E_{out}(g)\n",
    "\\le \\left(\\frac{\\epsilon}2+\\sqrt{E_{in}(g)+\\frac{\\epsilon^2}{4}}\\right)^2\n",
    "=\\frac{{\\epsilon}^2} {4}+E_{in}(g)+\\frac{\\epsilon^2}{4}+\\epsilon\\left (\\sqrt{E_{in}(g)+\\frac{\\epsilon^2}{4}}\\right)\n",
    "\\\\E_{out}(g)\n",
    "\\le \\frac{{\\epsilon}^2} {2}+E_{in}(g)+\\frac{{\\epsilon}^2}2\\sqrt{1+\\frac{4E_{in}(g)}{{\\epsilon}^2}}\n",
    "\\\\现在将\\xi={\\epsilon}^2带入可得\n",
    "\\\\E_{out}(g)\n",
    "\\le \\frac \\xi 2+E_{in}(g)+\\frac{\\xi}2\\sqrt{1+\\frac{4E_{in}(g)}{\\xi}}\n",
    "= E_{in}( g) + \\frac{\\xi}2\\left [1+ \\sqrt{1+\\frac{4E_{in}(g)}{\\xi}}\\ \\right]\n",
    "$$\n",
    "因此结论成立。其实这题就是纯粹计算，没什么技巧性。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.22 (Page 74)\n",
    "\n",
    "When there is noise in the data , $E_{out} (g^{(D)}) = E_{x,y} [(g^{(D)} (x) - y(x))^2] $, where $y(x) = f(x) + \\epsilon$. If $\\epsilon$ is a zero mean noise random variable with variance $\\delta^2$ , show that the bias variance decomposition becomes \n",
    "$$\n",
    "E_D[E_{out} (g^{(D)})] = \\delta^2 + bias + var.\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "方差和偏差的公式可以查看课本63页，这里我们直接计算。\n",
    "$$\n",
    "\\begin{aligned}\n",
    "E_D[E_{out} (g^{(D)})] &=E_D\\left [E_{x,y} [(g^{(D)} (x) - y(x))^2]\\right ]\n",
    "\\\\&=E_D\\left [E_{x} [(g^{(D)} (x) -f(x) - \\epsilon )^2]\\right ]\n",
    "\\\\&=E_D\\left [E_{x} [(g^{(D)} (x) -f(x))^2]+E_{x}(\\epsilon^2)-2 E_{x}[ \\epsilon(g^{(D)} (x) -f(x))] \\right ]\n",
    "\\end{aligned}\n",
    "$$\n",
    "我们分别看下上述三项，首先看第一项\n",
    "$$\n",
    "\\begin{aligned}\n",
    "E_D\\left [E_{x} [(g^{(D)} (x) -f(x))^2]\\right]&=E_D\\left [E_{x} [(g^{(D)} (x) -f(x))^2]\\right](这一步使用由于g^{(D)} (x) -f(x)没有关于y的项)\n",
    "\\\\&=E_x\\left [E_{D} [(g^{(D)} (x) -f(x))^2]\\right]\n",
    "\\\\&=bias+var(这一步可以参考课本63页)\n",
    "\\end{aligned}\n",
    "$$\n",
    "再来看下第二项，注意$\\epsilon$数学期望为0，方差为$\\delta^2$\n",
    "$$\n",
    "E_D\\left [E_{x}(\\epsilon^2) \\right ]=E_D\\left [E_{x}(\\epsilon^2) \\right ]=E_D(\\delta^2)=\\delta^2\n",
    "$$\n",
    "最后来看下第三项，注意$\\epsilon$数学期望为0\n",
    "$$\n",
    "E_D\\left [-2 E_{x}[ \\epsilon(g^{(D)} (x) -f(x))] \\right ]=E_D\\left [-2E_x(\\epsilon)E_x[g^{(D)} (x) -f(x)]\\right ]=0\n",
    "$$\n",
    "集合上述三点可得\n",
    "$$\n",
    "E_D[E_{out} (g^{(D)})] = \\delta^2 + bias + var.\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.23 (Page 74)\n",
    "\n",
    "Consider the learning problem in Example 2.8, where the input space is $\\mathcal X = [-1, +1] $, the target function is $f(x) = sin(\\pi x) $, and the input probability distribution is unifrm on $\\mathcal X$. Assume that the training set $D$ has only two data points (picked independently), and that the learning algorithm picks the hypothesis that minimizes the in sample mean squared error. In this problem, we will dig deeper into this case.    \n",
    "\n",
    "For each of the following learning models, find (analytically or numerically) (i) the best hypothesis that approximates $f$ in the mean squared error sense (assume that $f $ is known for this part) , (ii) the expected value (with respect to $D$) of the hypothesis that the learning algorithm produces, and (iii) the expected out of sample error and its bias and var components. \n",
    "\n",
    "(a) The learning model consists of all hypotheses of the form $h(x) = ax + b $(if you need to deal with the infinitesimal probability case of two identical data points, choose the hypothesis tangential to $f$). \n",
    "\n",
    "(b) The learning model consists of all hypotheses of the form $h(x) = ax$. This case was not covered in Example 2.8 . \n",
    "\n",
    "(c) The learning model consists of all hypotheses of the form $h(x) = b$. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这题我的理解是这样的：\n",
    "\n",
    "(i)先根据两个样本求一下三种模型的在平方误差下的最优解。\n",
    "\n",
    "(ii)学习算法产生的假设的数学期望，也就是课本63页中的$E_{out}(g^{(D)})=E_x \\left [(g^{(D)}(x)-f(x))^2\\right]$。这部分要用编程模拟，直接求的话感觉不大可行。\n",
    "\n",
    "(iii)(ii)已经求出$E_{out}(g^{(D)})$,只要求$var,bias$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面分别做一下，这里统一假设两个样本点为$(x_1,y_1),(x_2,y_2),y_i=sin(\\pi x_i)$\n",
    "\n",
    "(a)\n",
    "\n",
    "(i)平方误差$S_1=(ax_1+b-y_1)^2+(ax_2+b-y_2)^2$，这个实际上就是一元线性回归的特殊情形，这里直接套公式了\n",
    "$$\n",
    "\\\\使得\\sum_{i=1}^n(ax_i+b-y_i)^2最小的a,b满足\n",
    "\\\\\\tilde{a}=\\frac {l_{xy}}{l_{xx}}\n",
    "\\\\ \\tilde{b}=\\overline{y}-\\tilde{a}\\overline{x}\n",
    "\\\\其中\\overline{y}=\\frac{\\sum_{i=1}^ny_i}n,\\overline{x}=\\frac{\\sum_{i=1}^nx_i}n\n",
    "\\\\l_{xx}=\\sum_{i=1}^n(x_i-\\overline{x})^2,l_{xy}=\\sum_{i=1}^n(x_i-\\overline{x})(y_i-\\overline{y})\n",
    "$$\n",
    "不过由于这题是两个点，所以最好的直线实际上就是过这两个点的直线，因此\n",
    "$$\n",
    "y_1=ax_1+b\n",
    "\\\\y_2=ax_2+b\n",
    "\\\\a=\\frac{y_2-y_1}{x_2-x_1}\n",
    "\\\\b=y_1-ax_1=y_1-\\frac{y_2-y_1}{x_2-x_1}x_1=\\frac{y_1x_2-y_2x_1}{x_2-x_1}\n",
    "$$\n",
    "后续部分也会采用这个公式"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(ii)这部分采用编程模拟,我们先画个图看一下,第一步先把点构造出来"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import math\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "\n",
    "def f(x):\n",
    "    return math.sin(math.pi*x)\n",
    "\n",
    "#已知(x1,y1),(x2,y2)过直线y=kx+b，此函数返回k,b\n",
    "def treat(x1,x2):\n",
    "    y1=f(x1)\n",
    "    y2=f(x2)\n",
    "    k=(y2-y1)/(x2-x1)\n",
    "    b=(y1*x2-y2*x1)/(x2-x1)\n",
    "    return k,b\n",
    "\n",
    "#产生-1到1的20个点，对每个点，求每个点与其后面一个点连线的直线\n",
    "x=np.arange(-1,1,0.05)\n",
    "\n",
    "#求出对应的k,b\n",
    "u=[]\n",
    "for i in range(x.size-1):\n",
    "    u.append(treat(x[i],x[i+1]))\n",
    "\n",
    "#求出直线\n",
    "X1=np.array([-1.0,1.0])\n",
    "Y1=[]\n",
    "for i in u:\n",
    "    temp=X*i[0]+i[1]\n",
    "    Y1.append(temp)\n",
    "\n",
    "#y=sin(pix)\n",
    "X2=np.arange(-1,1,0.01)\n",
    "Y2=np.array([])\n",
    "for i in X2:\n",
    "    Y2=np.append(Y2,f(i))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "作图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nSLYx/x+Y7iuJhY4/1gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1bf20596278>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for i in Y1:\n",
    "    plt.plot(X1,i)\n",
    "plt.scatter(X2,Y2,c='BLACK')\n",
    "#plt.ylim(-2.0,2.0)\n",
    "#plt.xlim(-2.0,2.0)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1.8829992352626945, 1.409809326862331e-10)"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#定义误差函数\n",
    "def s1(x,x1,x2):\n",
    "    y1=f(x1)\n",
    "    y2=f(x2)\n",
    "    #为了防止分母为0\n",
    "    try:\n",
    "        k=(y2-y1)/(x2-x1)\n",
    "        b=(y1*x2-y2*x1)/(x2-x1)\n",
    "    except:\n",
    "        k=(y2-y1)/(x2-x1+10**(-6))\n",
    "        b=(y1*x2-y2*x1)/(x2-x1+10**(-6))\n",
    "    y=f(x)\n",
    "    y1=k*x+b\n",
    "    return 1/8*(y-y1)**2\n",
    "\n",
    "from scipy import integrate\n",
    "integrate.tplquad(s1, -1, 1, lambda x: -1, lambda x: 1,lambda x, y: -1, lambda x, y: 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里采用了scipy库来计算积分，我们看下书上65页的结果,$bias=0.21,var=1.69$，加起来为1.90，还是非常接近的，这样这部分就完成了。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(iii)查看课本63页，要计算$bias$与$var$，我们需要计算出$\\overline{g}(x)$，这里我们用模拟的方式求出数值解。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(0.7542004631515686, 0.004634631960119373)\n",
      "(0.7932272074612549, 0.009111960322264611)\n",
      "(0.7695429568430187, 0.002195554938190729)\n",
      "(0.7755646547742779, 0.002358727187576683)\n",
      "(0.773695809246891, 0.0008405129459178611)\n",
      "(0.773953663591212, 9.874361676723804e-05)\n",
      "(0.7711379169264839, -0.00030202996554230024)\n",
      "(0.765253062648756, -0.0028639442057468425)\n",
      "(0.7760896638149842, -0.0023032291702520225)\n",
      "(0.7715108115910325, 0.0033123763043239156)\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "#模拟求出系数\n",
    "def simulation(n):\n",
    "    k=0\n",
    "    b=0\n",
    "    #模拟n次\n",
    "    for i in range(n):\n",
    "        #产生-1,1之间均匀分布随机数\n",
    "        x1=random.uniform(-1,1)\n",
    "        x2=random.uniform(-1,1)\n",
    "        k1,b1=treat(x1,x2)\n",
    "        k+=k1\n",
    "        b+=b1\n",
    "    return(k/n,b/n)\n",
    "\n",
    "#比较下10000次以上的结果\n",
    "n=range(10**4,10**5+1,10**4)\n",
    "result=[]\n",
    "for i in n:\n",
    "    temp=simulation(i)\n",
    "    print(temp)\n",
    "    result.append(temp)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，模拟10000次以上得出的结果都比较接近，这里我们取最后一组数据,然后计算$bias$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.20948866551500994, 5.533237730644674e-10)"
      ]
     },
     "execution_count": 158,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a1,b1=result[0]\n",
    "\n",
    "def bias(x):\n",
    "    y1=a1*x+b1\n",
    "    y2=f(x)\n",
    "    return (y1-y2)**2/2\n",
    "\n",
    "integrate.quad(bias,-1,1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "四舍五入之后就是书上65页的0.21。实际上这时候var已经不需要计算了，只要拿(ii)的结果减去这里计算的$bias$即可，但是为了严谨起见，这里依旧把剩余部分模拟完。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1.6764612538182753, 2.313615495152879e-12)"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def var(x,x1,x2):\n",
    "    y1=f(x1)\n",
    "    y2=f(x2)\n",
    "    try:\n",
    "        k=(y2-y1)/(x2-x1)\n",
    "        b=(y1*x2-y2*x1)/(x2-x1)\n",
    "    except:\n",
    "        k=(y2-y1)/(x2-x1+10**(-6))\n",
    "        b=(y1*x2-y2*x1)/(x2-x1+10**(-6))\n",
    "    yavg=a1*x+b1\n",
    "    yrea=k*x+b\n",
    "    return 1/8*(yavg-yrea)**2\n",
    "\n",
    "integrate.tplquad(var, -1, 1, lambda x: -1, lambda x: 1,lambda x, y: -1, lambda x, y: 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里的值和书上比差了一些，推测是$\\overline{g}(x)$选择的问题。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1bf1eef2208>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for i in Y1:\n",
    "    plt.plot(X1,i,c='RED')\n",
    "plt.scatter(X2,Y2,c='BLACK')\n",
    "#plt.ylim(-2.0,2.0)\n",
    "#plt.xlim(-2.0,2.0)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(b)\n",
    "\n",
    "(i)现在误差函数为$S_1=(ax_1-y_1)^2+(ax_2-y_2)^2$，我们来对这个式子做简单的处理\n",
    "$$\n",
    "\\begin{aligned}\n",
    "S_1&=(ax_1-y_1)^2+(ax_2-y_2)^2\n",
    "\\\\&=(x_1^2+x_2^2)a^2-2(x_1y_1+x_2y_2)a+(y_1^2+y_2^2)\n",
    "\\end{aligned}\n",
    "$$\n",
    "由二次函数的性质，我们知道当$a=\\frac{x_1y_1+x_2y_2}{x_1^2+x_2^2}$时，$S_1$最小"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(ii)和上一题一样的处理方法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.507219461635839, 1.3595152276862434e-08)"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#定义误差函数\n",
    "def s1_b(x,x1,x2):\n",
    "    y1=f(x1)\n",
    "    y2=f(x2)\n",
    "    #为了防止分母为0\n",
    "    try:\n",
    "        a=(x1*y1+x2*y2)/(x1**2+x2**2)\n",
    "    except:\n",
    "        a=(x1*y1+x2*y2)/(x1**2+x2**2+10**(-6))\n",
    "    y=f(x)\n",
    "    y1=a*x\n",
    "    return 1/8*(y-y1)**2\n",
    "\n",
    "from scipy import integrate\n",
    "integrate.tplquad(s1_b, -1, 1, lambda x: -1, lambda x: 1,lambda x, y: -1, lambda x, y: 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(iii)依旧和上一题同样的处理方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.4200452579450005\n",
      "1.4361549290329403\n",
      "1.4323122336941063\n",
      "1.4294661412749146\n",
      "1.4327243249608024\n",
      "1.431817600645193\n",
      "1.428807063887397\n",
      "1.4229954500221687\n",
      "1.4303862267979082\n",
      "1.4312748986249892\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "#模拟求出系数\n",
    "def simulation_b(n):\n",
    "    a=0\n",
    "    #模拟n次\n",
    "    for i in range(n):\n",
    "        #产生-1,1之间均匀分布随机数\n",
    "        x1=random.uniform(-1,1)\n",
    "        x2=random.uniform(-1,1)\n",
    "        y1=f(x1)\n",
    "        y2=f(x2)\n",
    "        a1=(x1*y1+x2*y2)/(x1**2+x2**2)\n",
    "        a+=a1\n",
    "    return(a/n)\n",
    "\n",
    "#比较下10000次以上的结果\n",
    "n=range(10**4,10**5+1,10**4)\n",
    "result=[]\n",
    "for i in n:\n",
    "    temp=simulation_b(i)\n",
    "    print(temp)\n",
    "    result.append(temp)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "取$a=1.4312748986249892$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.2716713783199174, 3.7937944622448797e-10)"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a1=1.4312748986249892\n",
    "\n",
    "def bias_b(x):\n",
    "    y1=a1*x\n",
    "    y2=f(x)\n",
    "    return (y1-y2)**2/2\n",
    "\n",
    "integrate.quad(bias_b,-1,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.23657944182387183, 1.4859571695348272e-08)"
      ]
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def var_b(x,x1,x2):\n",
    "    y1=f(x1)\n",
    "    y2=f(x2)\n",
    "    try:\n",
    "        a=(x1*y1+x2*y2)/(x1**2+x2**2)\n",
    "    except:\n",
    "        a=(x1*y1+x2*y2)/(x1**2+x2**2+10**(-6))\n",
    "    yavg=a1*x\n",
    "    yrea=a*x\n",
    "    return 1/8*(yavg-yrea)**2\n",
    "\n",
    "integrate.tplquad(var_b, -1, 1, lambda x: -1, lambda x: 1,lambda x, y: -1, lambda x, y: 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可看看到$var+bias$和(ii)中求出的数值几乎相等，再一次验证了课本上的结论。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(c)\n",
    "\n",
    "(i)现在误差函数为$S_1=(b-y_1)^2+(b-y_2)^2$，我们来对这个式子做简单的处理\n",
    "$$\n",
    "\\begin{aligned}\n",
    "S1&=2b^2-2(y_1+y_2)b+y_1^2+y_2^2\n",
    "\\end{aligned}\n",
    "$$\n",
    "由二次函数的性质，我们知道当$b=\\frac{y_1+y_2}{2}$时，S1最小"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(ii)和上一题一样的处理方法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.75, 9.174802559227526e-11)"
      ]
     },
     "execution_count": 175,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#定义误差函数\n",
    "def s1_c(x,x1,x2):\n",
    "    y1=f(x1)\n",
    "    y2=f(x2)\n",
    "    #为了防止分母为0\n",
    "    b=(y1+y2)/2\n",
    "    y=f(x)\n",
    "    y1=b\n",
    "    return 1/8*(y-y1)**2\n",
    "\n",
    "from scipy import integrate\n",
    "integrate.tplquad(s1_c, -1, 1, lambda x: -1, lambda x: 1,lambda x, y: -1, lambda x, y: 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(iii)依旧和上一题同样的处理方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.008196859582491021\n",
      "0.004748963983807663\n",
      "-0.0016901880747358293\n",
      "0.0040040873344500995\n",
      "0.0012692905572415974\n",
      "-0.0009000059860267343\n",
      "0.0013013029957423944\n",
      "0.00221990817969627\n",
      "-0.0007085095487530242\n",
      "0.002409096191388286\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "#模拟求出系数\n",
    "def simulation_c(n):\n",
    "    b=0\n",
    "    #模拟n次\n",
    "    for i in range(n):\n",
    "        #产生-1,1之间均匀分布随机数\n",
    "        x1=random.uniform(-1,1)\n",
    "        x2=random.uniform(-1,1)\n",
    "        y1=f(x1)\n",
    "        y2=f(x2)\n",
    "        b1=(y1+y2)/2\n",
    "        b+=b1\n",
    "    return(b/n)\n",
    "\n",
    "#比较下10000次以上的结果\n",
    "n=range(10**4,10**5+1,10**4)\n",
    "result=[]\n",
    "for i in n:\n",
    "    temp=simulation_c(i)\n",
    "    print(temp)\n",
    "    result.append(temp)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "依旧选取最后一组数据,$b=0.002409096191388286$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.5000058037444595, 3.669920676267717e-10)"
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b1=0.002409096191388286\n",
    "\n",
    "def bias_c(x):\n",
    "    y1=b1\n",
    "    y2=f(x)\n",
    "    return (y1-y2)**2/2\n",
    "\n",
    "integrate.quad(bias_c,-1,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.23657944182387183, 1.4859571695348272e-08)"
      ]
     },
     "execution_count": 181,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def var_c(x,x1,x2):\n",
    "    y1=f(x1)\n",
    "    y2=f(x2)\n",
    "    b=(y1+y2)/2\n",
    "    yavg=b1\n",
    "    yrea=b\n",
    "    return 1/8*(yavg-yrea)**2\n",
    "\n",
    "integrate.tplquad(var_b, -1, 1, lambda x: -1, lambda x: 1,lambda x, y: -1, lambda x, y: 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "和书上页基本一致。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最后总结一下，这题设计的目的是让我们从实验中验证$bias,var$的等式，我一开始这题完全没有头绪，不过后来做完之后对这部分理解更加深刻了。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 2.24 (Page 75)\n",
    "\n",
    "Consider a simplified learning scenario. Assume that the input dimension is one. Assume that the input variable $x$ is uniformly distributed in the interval $[-1, 1]$ . The data set consists of 2 points $\\{ x_1, x_2\\}$ and assume that the target function is $f(x) = x^2$. Thus, the full data set is $D= \\{(x_1 , x_1^2), (x_2, x_2^2)\\}$. The learning algorithm returns the line fitting these two points as $g$ ($\\mathcal H$ consists of functions of the frm $h(x) = ax + b$). We are interested in the test performance ($E_{out}$) of our learning system with respect to the squared error measure, the bias and the var. \n",
    "\n",
    "(a) Give the analytic expression fr the average function $\\overline g(x)$. \n",
    "\n",
    "(b) Describe an experiment that you could run to determine (numerically) $\\overline g(x)$ , $E_{out}$, bias, and var. \n",
    "\n",
    "(c) Run your experiment and report the results. Compare Bout with bias+var. Provide a plot of your $\\overline g(x)$ and $f(x)$ (on the same plot) . \n",
    "\n",
    "(d) Compute analytically what $E_{out}$. bias and var should be.    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这题其实和上一题的(a)基本一样，只不过这里的$f(x)=x^2$\n",
    "\n",
    "(a)对于固定的两个点$D= \\{(x_1 , x_1^2), (x_2, x_2^2)\\}$，训练误差最小的直线为过这两个点的直线，假设直线为$g(x) = ax + b$，因此\n",
    "$$\n",
    "x_2^2=ax_2+b\n",
    "\\\\x_1^2=ax_1+b\n",
    "\\\\a=(x_1+x_2)\n",
    "\\\\b=-x_1x_2\n",
    "$$\n",
    "那么$g(x) = (x_1+x_2)x -x_1x_2$\n",
    "\n",
    "假设有$D_1,...,D_K$这$K$组数据，每个$D_i$有两个点$x_{i1},x_{i2}$，那么$D_i$训练出来的$g_i(x)=(x_{i1}+x_{i2})x -x_{i1}x_{i2}$，回到课本63页$\\overline g(x)$的定义可知\n",
    "$$\n",
    "\\overline{g}(x)=\\frac 1 K\\sum_{i=1}^Kg_i(x)\n",
    "$$\n",
    "(b)这部分就是采用数值解，和上一题采用的方法同理。\n",
    "\n",
    "$\\overline{g}(x)$我采取的方法是在$[-1,1]$上随机取两个点(均匀分布)，然后计算对应的$g_i(x)$，重复这实验多次，利用$\\overline{g}(x)=\\frac 1 K\\sum_{i=1}^Kg_i(x)$计算。\n",
    "\n",
    "再来看下$E_{out}(g^{(D)})$,注意书上的公式\n",
    "$$\n",
    "E_{out}(g^{(D)})=E_x \\left [(g^{(D)}(x)-f(x))^2\\right]\n",
    "$$\n",
    "我们已经知道对于$D= \\{(x_1 , x_1^2), (x_2, x_2^2)\\}$，$g(x) = (x_1+x_2)x -x_1x_2$，带入上式计算关于$x_1,x_2,x$的三重积分即可。\n",
    "\n",
    "$bias$可以参考课本63页的公式\n",
    "$$\n",
    "bias(x) = (\\overline g(x) - f(x))^2,bias=E_x[bias(x)]\n",
    "$$\n",
    "之前已经计算出了$\\overline g(x)$，带入上式做积分即可。\n",
    "\n",
    "$var$可以参考课本64页的公式\n",
    "$$\n",
    "var(x)=E_D[(g^{(D)} (x) - \\overline g(x))^2],var=E_x[var(x)]\n",
    "$$\n",
    "我们已经知道对于$D= \\{(x_1 , x_1^2), (x_2, x_2^2)\\}$，$g(x) = (x_1+x_2)x -x_1x_2$，带入上式计算关于$x_1,x_2,x$的三重积分即可。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(c)下面通过模拟计算一下，先计算$\\overline g(x)$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(0.001936147957465867, -0.0013630419506564689)\n",
      "(-0.0011100104837898294, 0.0007106102904249165)\n",
      "(0.007036228804454655, 0.0022387392986593763)\n",
      "(0.0036037885530697594, -0.0025503664604139744)\n",
      "(-0.0021659042920975703, 0.0005807937629647986)\n",
      "(0.005749093303044227, 0.0006208087771658737)\n",
      "(-0.0005984132463209331, -0.00011264502000000663)\n",
      "(0.0014864777632894372, -0.0014178489060713278)\n",
      "(-0.0009288612232758783, 0.0007764903473425881)\n",
      "(0.0029127592564764616, -0.0010760763093043003)\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "def f(x):\n",
    "    return x**2\n",
    "\n",
    "#模拟求出系数\n",
    "def simulation(n):\n",
    "    a=0\n",
    "    b=0\n",
    "    #模拟n次\n",
    "    for i in range(n):\n",
    "        #产生-1,1之间均匀分布随机数\n",
    "        x1=random.uniform(-1,1)\n",
    "        x2=random.uniform(-1,1)\n",
    "        y1=f(x1)\n",
    "        y2=f(x2)\n",
    "        a1=(x1+x2)\n",
    "        b1=-x1*x2\n",
    "        a+=a1\n",
    "        b+=b1\n",
    "    return(a/n,b/n)\n",
    "\n",
    "#比较下10000次以上的结果\n",
    "n=range(10**4,10**5+1,10**4)\n",
    "result=[]\n",
    "for i in n:\n",
    "    temp=simulation(i)\n",
    "    print(temp)\n",
    "    result.append(temp)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到后面的结果已经比较接近了，我们这里取最后一组数据，然后作图。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x184a45d3ba8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import math\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "\n",
    "a,b=result[-1]\n",
    "x1=np.arange(-1,1.1,0.1)\n",
    "y1=[f(i) for i in x1]\n",
    "x2=[-1,1]\n",
    "y2=[a*i+b for i in x2]\n",
    "\n",
    "plt.plot(x1,y1)\n",
    "plt.plot(x2,y2)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "计算$E_{out}(g^{(D)})$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.5333333333333333, 8.785771717918444e-15)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy import integrate\n",
    "\n",
    "#定义误差函数\n",
    "def s1(x,x1,x2):\n",
    "    y1=f(x1)\n",
    "    y2=f(x2)\n",
    "    a=(x1+x2)\n",
    "    b=-x1*x2\n",
    "    y=f(x)\n",
    "    y1=a*x+b\n",
    "    return 1/8*(y-y1)**2\n",
    "\n",
    "integrate.tplquad(s1, -1, 1, lambda x: -1, lambda x: 1,lambda x, y: -1, lambda x, y: 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$bias$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.2007213702019217, 2.228454867324833e-15)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def bias(x):\n",
    "    a,b=result[-1]\n",
    "    y1=a*x+b\n",
    "    y2=f(x)\n",
    "    return (y1-y2)**2/2\n",
    "\n",
    "integrate.quad(bias,-1,1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$var$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.3333373193290522, 6.401147296799422e-15)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def var(x,x1,x2):\n",
    "    a,b=result[-1]\n",
    "    yavg=a*x+b\n",
    "    y1=f(x1)\n",
    "    y2=f(x2)\n",
    "    a1=(x1+x2)\n",
    "    b1=-x1*x2\n",
    "    yrea=a1*x+b1\n",
    "    return 1/8*(yavg-yrea)**2\n",
    "\n",
    "integrate.tplquad(var, -1, 1, lambda x: -1, lambda x: 1,lambda x, y: -1, lambda x, y: 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到$E_{out}(g^{(D)})=bias+var$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(d)计算$E_{out},bias,var​$的解析解，只要分别计算积分即可。\n",
    "\n",
    "先看$E_{out}$\n",
    "$$\n",
    "\\begin{aligned}\n",
    "E_{out}&=E_x \\left[ ((x_1+x_2)x -x_1x_2-x^2)^2\\right]\n",
    "\\\\&=\\frac 1 8\\int _{-1}^{1}\\int _{-1}^{1}\\int _{-1}^{1}\\Big [(x-x_2)x_1+x_2x-x^2\\Big]^2dx_1dx_2dx\n",
    "\\\\&=\\frac 1 8\\int _{-1}^{1}\\int _{-1}^{1}\\int _{-1}^{1}\\Big [(x-x_2)^2x_1^2+2(x-x_2)x_1(x_2x-x^2)+(x_2x-x^2)^2\\Big]dx_1dx_2dx\n",
    "\\\\&=\\frac 1 8\\int _{-1}^{1}\\int _{-1}^{1}\\Big [ \\frac {2(x-x_2)^2}{3}+2(x_2x-x^2)^2\\Big]dx_2dx\n",
    "\\\\&=\\frac 1 8\\int _{-1}^{1}\\int _{-1}^{1}\\Big [\\frac23(x^2-2xx_2+x_2^2)+2x^2(x_2^2-2xx_2+x^2) \\Big]dx_2dx\n",
    "\\\\&=\\frac 1 8\\int _{-1}^{1}(\\frac23+2x^2)(\\frac 2 3+2x^2)dx\n",
    "\\\\&=\\frac 1 8\\int _{-1}^{1}(\\frac 4 9+4x^4+\\frac 8 3x^2)dx\n",
    "\\\\&=\\frac 1 8(\\frac 8 9+\\frac 8 5+\\frac 16 9)\n",
    "\\\\&=\\frac 1 3+\\frac 15\n",
    "\\\\&\\approx 0.53\n",
    "\\end{aligned}\n",
    "$$\n",
    "可以看到和我们之前模拟的数值解基本一致。\n",
    "\n",
    "求$bias,var$之前，先得求$\\overline g(x)$，设$\\overline g(x)=ax+b$。我们知道对于$D= \\{(x_1 , x_1^2), (x_2, x_2^2)\\}$，$g(x) = (x_1+x_2)x -x_1x_2$，那么由$\\overline g(x)$的定义我们知道\n",
    "$$\n",
    "a=E(x_1+x_2),b=E(-x_1x_2)\n",
    "$$\n",
    "那么\n",
    "$$\n",
    "\\begin{aligned}\n",
    "a&=E(x_1+x_2)\n",
    "\\\\&=\\frac 1 4\\int_{-1}^1\\int_{-1}^1(x_1+x_2)dx_1dx_2\n",
    "\\\\&=\\frac 1 4 \\int_{-1}^12x_2dx_2\n",
    "\\\\&=0\n",
    "\\end{aligned}\n",
    "$$\n",
    "\n",
    "$$\n",
    "\\begin{aligned}\n",
    "b&=E(-x_1x_2)\n",
    "\\\\&=\\int_{-1}^1\\int_{-1}^1(-x_1x_2)dx_1dx_2\n",
    "\\\\&=-\\int_{-1}^1x_1dx_1\\int_{-1}^1x_2dx_2\n",
    "\\\\&=0\n",
    "\\end{aligned}\n",
    "$$\n",
    "\n",
    "因此$\\overline g(x)=0$，接下来求$bias$\n",
    "$$\n",
    "\\begin{aligned}\n",
    "bias&=E_x[(\\overline g(x) - f(x))^2]\n",
    "\\\\&=\\int_{-1}^1x^4dx\n",
    "\\\\&=0.2\n",
    "\\end{aligned}\n",
    "$$\n",
    "和我们之前模拟的结果一致。\n",
    "\n",
    "最后求$var$\n",
    "$$\n",
    "\\begin{aligned}\n",
    "var&=E_x[E_D[(g^{(D)} (x) - \\overline g(x))^2]]\n",
    "\\\\&=\\frac 1 8\\int _{-1}^{1}\\int _{-1}^{1}\\int _{-1}^{1}\\Big[(x_1+x_2)x -x_1x_2\\Big]^2dxdx_1dx_2\n",
    "\\\\&=\\frac 1 8\\int _{-1}^{1}\\int _{-1}^{1}\\int _{-1}^{1}\\Big[ (x_1+x_2)^2x^2+x_1^2x_2^2-2x_1x_2(x_1+x_2)x\\Big]dxdx_1dx_2\n",
    "\\\\&=\\frac 1 8\\int _{-1}^{1}\\int _{-1}^{1}\\Big[\\frac{2(x_1^2+x_2^2+2x_1x_2)}{3}+2x_1^2x_2^2 \\Big]dx_1dx_2\n",
    "\\\\&=\\frac 1 8\\int _{-1}^{1}\\Big[{\\frac 4 9+\\frac{4}{3}x_2^2+\\frac 4 3 x_2^2}\\Big]dx_2\n",
    "\\\\&=\\frac 1 8(\\frac 8 9+\\frac {16} 9)\n",
    "\\\\&=\\frac 1 3\n",
    "\\\\&\\approx0.33\n",
    "\\end{aligned}\n",
    "$$\n",
    "和我们之前模拟的结果也一致"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
